SQL Server 索引優化 ——索引缺失


本文我們將重點給出動態視圖法發現數據庫中缺失的索引。對於索引的調整和新建將不在本文闡述范圍,后續將陸續分享相關經驗。

sys.dm_db_missing_index_details 缺失索引明細,包括相等列,不等列以及包含列,執行如下腳本,並查看結果

USE WideWorldImporters;
GO
SELECT * FROM sys.dm_db_missing_index_details;


從結果可以看出,所有數據庫中,缺失索引的表或索引視圖都被列出來了。但是否需要把列出來的缺失索引都直接建上去呢?顯然,這樣做可能不但不能提升性能,還可能會導致性能下降。如,

有些查詢是偶發性的,使用率極低,而對應的表又有大量的插入、更新等;

或者某些索引的創建對性能本身提升不多;

又或者,缺失索引的列,在某些存儲的索引中已經部分包含,按照缺失索引給出信息去創建,會造成索引冗余。

結合以上情形,如果我們想補缺失索引,那么我們還需要知道缺失索引使用的頻率,對性能的提升等信息。動態視圖sys.dm_db_missing_index_group_stats 給出了我們需要的信息,下面我們給出缺失索引的狀態

SELECT OBJECT_NAME(m.OBJECT_ID) tableName,equality_columns,inequality_columns,included_columns
,unique_compiles,user_seeks,user_scans,avg_user_impact,avg_system_impact
FROM sys.dm_db_missing_index_details m
LEFT JOIN sys.dm_db_missing_index_groups g ON m.index_handle=g.index_handle
LEFT JOIN sys.dm_db_missing_index_group_stats s ON g.index_group_handle=s.group_handle
WHERE m.database_id=DB_ID();
我們可以根據上面查詢的結果,用戶查找、用戶掃描次數,用戶性能影響,初步判斷需要的索引。最終還要根據已經存在的索引,以及索引創建的一些規則,確定需要新創建的索引。

創建角本:

SELECT TOP 100
statement AS 表 ,
equality_columns AS 相等列 ,
inequality_columns AS 不相等列 ,
included_columns AS 包含列 ,
user_scans + user_seeks AS 總查詢次數 ,
avg_user_impact AS 平均百分比收益 ,
avg_total_user_cost AS 平均成本 ,
avg_total_user_cost * avg_user_impact * ( user_scans + user_seeks ) AS 可能改進 ,

'CREATE INDEX [IX_' + obj.name + '_'
+ CONVERT(VARCHAR(32), GS.group_handle) + '_'
+ CONVERT(VARCHAR(32), D.index_handle) + ']' + ' ON ' + [statement]
+ ' (' + ISNULL(equality_columns, '')
+ CASE WHEN equality_columns IS NOT NULL
AND inequality_columns IS NOT NULL THEN ','
ELSE ''
END + ISNULL(inequality_columns, '') + ')' + ISNULL(' INCLUDE ('
+ included_columns
+ ')', '') AS Create_Index_Syntax
FROM sys.dm_db_missing_index_details AS D
INNER JOIN sys.dm_db_missing_index_groups G ON G.index_handle = D.index_handle
INNER JOIN sys.dm_db_missing_index_group_stats GS ON G.index_group_handle = GS.group_handle
INNER JOIN sys.objects AS obj ON obj.object_id = OBJECT_ID([statement])
AND obj.type = 'U'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM