工作中遇到的SQL Server索引相关问题(过多、缺失、启用)

直接上菜!
问题场景1:新增收款也没,速度响应太慢。数据库服务器CPU占用持续飚到90%以上。
运行环境:32位Win Server 2003企业版上装了SQL Server 2005 开发者版,AWE未成功开启。6G内存里,SQL Server只用到不到2G。
原因:三张核心大表上索引过多(每张表几十条索引……),且表上索引碎片过多,之前添加的索引维护计划由于客户禁用了代理导致任务计划无效,进而导致维护索引开销太大,插入和查询耗时均很长,经检测死锁发生频繁。
解决:
    1.根据碎片情况重建索引,重新配置AWE,生效后内存使用升到5G+,可是这部分工作的效果不大。开启AWE: http://msdn.microsoft.com/zh-cn/library/ms190673%28v=SQL.90%29.aspx
    2.删除主键索引外的绝大多数索引,涉及到插入的操作于是变快了很多。
    3.每隔三五小时,根据以下三张动态管理视图获取缺失一次索引
        sys.dm_db_missing_index_details
        sys.dm_db_missing_index_groups
        sys.dm_db_missing_index_group_stats 
      对比seek次数、开销和可提升倍数来选择添加哪些索引。反复几次之后,CPU占用大多时候在20%左右,繁忙时50%左右,高峰90%左右但大都会在10秒内降至正常水平。
    4.优化程序中逻辑读超高的查询,从而加快仍然较慢的查询操作。


问题场景2:开发给了一个多表连接的查询,很慢。
运行环境:Win7,SQL Server 2008 R2 64位
分析:查看io和耗时后,结合执行计划,发现对大表A的逻辑读次数奇高且先走这张表上的主键上建的非聚集索引,然后走主键上建的唯一聚集索引。貌似非聚集索引建的没有必要。
解决:删除冗余的非聚集索引。本想也删除唯一聚集索引然后再新建,发现行不通。通过Management Studio禁用唯一聚集索引后(天知道那会为什么要禁用),竟然不知道怎么重新启用了。最后看msdn发现rebuild一下就可以启用。alter index ix_name on 表A rebuild 其实还是通过Management Studio重建也一样。
看文档时发现个没见过的用法ALTER INDEX ALL REBUILD on 表A 见 http://msdn.microsoft.com/zh-cn/library/ms190645%28v=sql.100%29.aspx
结果:查询的执行时间从12-17秒缩短至2秒左右,对表A的逻辑读从38W+降至7K多。不动现有表结构的话,这算暂时解决了。

你可能感兴趣的:(SQL Server,索引维护)