SQL Server 索引优化 ——索引缺失
Posted 每天进步多一点
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server 索引优化 ——索引缺失相关的知识,希望对你有一定的参考价值。
sys.dm_db_missing_index_details 缺失索引明细,包括相等列,不等列以及包含列,执行如下脚本,并查看结果
1 USE [testDB] 2 GO 3 SELECT * FROM sys.dm_db_missing_index_details;
从结果可以看出,所有数据库中,缺失索引的表或索引视图都被列出来了。但是否需要把列出来的缺失索引都直接建上去呢?
显然,这样做可能不但不能提升性能,还可能会导致性能下降。
如: 有些查询是偶发性的,使用率极低,而对应的表又有大量的插入、更新等;或者某些索引的创建对性能本身提升不多;
又或者,缺失索引的列,在某些存储的索引中已经部分包含,按照缺失索引给出信息去创建,会造成索引冗余。
结合以上情形,如果我们想补缺失索引,那么我们还需要知道缺失索引使用的频率,对性能的提升等信息。
动态视图sys.dm_db_missing_index_group_stats 给出了我们需要的信息,
下面我们给出缺失索引的状态
1 SELECT OBJECT_NAME(m.OBJECT_ID) tableName,equality_columns,inequality_columns,included_columns, 2 unique_compiles,user_seeks,user_scans,avg_user_impact,avg_system_impact 3 FROM sys.dm_db_missing_index_details m 4 LEFT JOIN sys.dm_db_missing_index_groups g ON m.index_handle=g.index_handle 5 LEFT JOIN sys.dm_db_missing_index_group_stats s ON g.index_group_handle=s.group_handle 6 WHERE m.database_id=DB_ID();
我们可以根据上面查询的结果,用户查找、用户扫描次数,用户性能影响,初步判断需要的索引。
最终还要根据已经存在的索引,以及索引创建的一些规则,确定需要新创建的索引。
创建脚本:
1 SELECT TOP 100 2 statement AS 表 , 3 equality_columns AS 相等列 , 4 inequality_columns AS 不相等列 , 5 included_columns AS 包含列 , 6 user_scans + user_seeks AS 总查询次数 , 7 avg_user_impact AS 平均百分比收益 , 8 avg_total_user_cost AS 平均成本 , 9 avg_total_user_cost * avg_user_impact * ( user_scans + user_seeks ) AS 可能改进 , 10 \'CREATE INDEX [index_\' + obj.name + \'_\' 11 + CONVERT(VARCHAR(32), GS.group_handle) + \'_\' 12 + CONVERT(VARCHAR(32), D.index_handle) + \']\' + \' ON \' + [statement] 13 + \' (\' + ISNULL(equality_columns, \'\') 14 + CASE WHEN equality_columns IS NOT NULL 15 AND inequality_columns IS NOT NULL THEN \',\' 16 ELSE \'\' 17 END + ISNULL(inequality_columns, \'\') + \')\' + ISNULL(\' INCLUDE (\' 18 + included_columns 19 + \')\', \'\') AS Create_Index_Syntax 20 FROM sys.dm_db_missing_index_details AS D 21 INNER JOIN sys.dm_db_missing_index_groups G ON G.index_handle = D.index_handle 22 INNER JOIN sys.dm_db_missing_index_group_stats GS ON G.index_group_handle = GS.group_handle 23 INNER JOIN sys.objects AS obj ON obj.object_id = OBJECT_ID([statement]) 24 AND obj.type = \'U\'
以上是关于SQL Server 索引优化 ——索引缺失的主要内容,如果未能解决你的问题,请参考以下文章