没重装系统前:环境:windows server 2003(32)+IIS6.0+.net4.0+sql2005;网站使用一切正常。
重装系统后:环境1:windows server 2003(64)+IIS6.0+.net4.0+sql2005;网站使用很卡。
环境2:windows server 2003(64)+IIS6.0+.net4.0+sql2008(32);网站使用很卡。
使用查询分析器直接执行sql语句,单表查询很快,夺标查询就很慢,数据库什么的都是以前的。后来再某张表加了索引,速度恢复。但我的库有几百张表,我不可能每张都去加索引啊。
怀疑问题:32位的数据库在64位的系统上访问慢。
请大侠帮忙看看,分不多,先拜谢!!
sql serverwindows serverasp.net操作系统

解决方案 »

  1.   

    要速度快,最好是把sql server 换成64位的。不过从你的描述来看,应该也不完全是版本的问题,好像你的数据库缺少索引。--监控缺失索引:SELECT TOP 30
             ROUND(s.avg_total_user_cost * s.avg_user_impact * ( s.user_seeks
                                                                 + s.user_scans ),
                   0) AS [Total Cost] ,
             s.avg_total_user_cost * ( s.avg_user_impact / 100.0 ) * ( s.user_seeks
                                                                   + s.user_scans ) AS Improvement_Measure ,
             DB_NAME() AS DatabaseName ,
             d.[statement] AS [Table Name] ,
             equality_columns ,
             inequality_columns ,
             included_columns
     FROM    sys.dm_db_missing_index_groups g
             INNER JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle
             INNER JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle
     WHERE   s.avg_total_user_cost * ( s.avg_user_impact / 100.0 ) * ( s.user_seeks
                                                                   + s.user_scans ) > 10
     ORDER BY [Total Cost] DESC ,
             s.avg_total_user_cost * s.avg_user_impact * ( s.user_seeks
                                                           + s.user_scans ) DESC
      

  2.   

    另外,还可以监控,哪些索引是建了,没有用到的,这样的索引应该及时删掉:
    --如果user_seeks为0,user_updates很多,而说明建了索引没什么用
    select 
    DB_NAME(d.database_id),
    OBJECT_NAME(d.object_id),

    i.name,
    user_seeks,   --查找次数
    user_scans,   --扫描次数
    user_lookups, --书签查找次数

    user_updates  --通过用户查询执行的更新次数  
    from sys.dm_db_index_usage_stats d
    inner join sys.indexes i
        on d.object_id = i.object_id
           and d.index_id = i.index_id
    where database_id = DB_ID('数据库名称')
      

  3.   

    SELECT TOP 5 * FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC 查查这个东西
      

  4.   

    检查一下SQL2005 SP4安装了没.更新一下统计信息,重建大表的索引,重启之后试试.
      

  5.   


    非常感谢,现在问题解决了,是某一张表的索引失效,表中有5W条数据,在程序中有多处引用该表。有个疑问,为什么索引会失效了,我重建了n次都不行,有什么地方被我忽略了吗?请指导,,哦 ,你说的索引失效其实就是,这个索引没有用到,比如你写了一个sql语句,那么你又建了一个索引,你认为这个语句能用上这个索引,但实际上从执行计划上看,这个sql语句,根本没有走这个索引,所以这个索引就是无效的索引。无效的索引不是说,你通过重建,就能生效,而是说,你建的这个索引,sql server认为没必要用,因为sql server认为用了你的索引,sql执行起来,反而会更慢。所以,你必须按照语句的实际情况,来建索引。比如,你的sql语句是这样的:select xxx,yyy from tb where cast(a as int) > 5那么你建了如下索引:create index idx_tb_a on tb(a)那么,你会发现,在执行语句是,sql server不会用这个idx_tb_a索引,因为你在where子句中,用了函数,这样cast(a as int) ,就会导致索引用不到。还有像 where a like '%www%'
    也会导致用不上索引