MS SQL SERVER索引優化相關查詢

MaxIE發表於2014-01-26
 
 

查詢缺失索引

-- =============================================
 
-- Description: 查詢當前資料庫中缺失的索引,知道你進行優化的參考。
 
-- =============================================
 
SELECT user_seeks * avg_total_user_cost * ( avg_user_impact * 0.01 ) AS [index_advantage] ,
 
migs.last_user_seek , --上一次訪問時間
 
mid.[statement] AS [Database.Schema.Table] ,--表
 
mid.equality_columns , --等式判斷列
 
mid.inequality_columns ,--不等式判斷列
 
mid.included_columns ,--於查詢的涵蓋列的逗號分隔列表。有關涵蓋列或包含列的詳細資訊
 
migs.unique_compiles , --將從該缺失索引組受益的編譯和重新編譯數。許多不同查詢的編譯和重新編譯可影響該列值
 
migs.user_seeks , --由可能使用了組中建議索引的使用者查詢所導致的查詢次數
 
migs.avg_total_user_cost ,-- 可通過組中的索引減少的使用者查詢的平均成本
 
migs.avg_user_impact --實現此缺失索引組後,使用者查詢可能獲得的平均百分比收益。該值表示如果實現此缺失索引組,則查詢成本將按此百分比平均下降。
 
FROM sys.dm_db_missing_index_group_stats AS migs WITH ( NOLOCK )
 
INNER JOIN sys.dm_db_missing_index_groups AS mig WITH ( NOLOCK ) ON migs.group_handle = mig.index_group_handle
 
INNER JOIN sys.dm_db_missing_index_details AS mid WITH ( NOLOCK ) ON mig.index_handle = mid.index_handle
 
WHERE mid.database_id = DB_ID()--預設當前資料庫。如果自己定義的資料庫則使用DB_ID ( [ 'database_name' ] )
 
ORDER BY index_advantage DESC
 

後續說明:

具有較高的 index_advantage 的索引那些 SQL 伺服器認為會產生最大的積極影響,減少工作量,基於查詢的成本和預期他們會使用索引的次數減少。

 

 

檢視現有索引的使用情況 

-- =============================================
-- Description: 查詢當前資料庫中所有堆表、 聚集的索引和非聚集索引、 讀取、 寫入和每個索引的填充因子的數量,知道你進行優化的參考。
--Index Read/Write stats (all tables in current DB)
-- =============================================
  SELECT OBJECT_NAME(s.[object_id]) AS [ObjectName] ,
  i.name AS [IndexName] , i.index_id ,
  user_seeks + user_scans + user_lookups AS [Reads] ,
  user_updates AS [Writes] ,
  i.type_desc AS [IndexType] ,
  i.fill_factor AS [FillFactor]--填充因子
  FROM sys.dm_db_index_usage_stats AS s
  INNER JOIN sys.indexes AS i ON s.[object_id] = i.[object_id]
  WHERE OBJECTPROPERTY(s.[object_id], 'IsUserTable') = 1
  AND i.index_id = s.index_id
  AND s.database_id = DB_ID()
  ORDER BY OBJECT_NAME(s.[object_id]) ,
  writes DESC ,
  reads DESC ;

這是一個有用的查詢,為更好地瞭解資料庫的工作負荷。它可以幫助您確定某個特定的索引的波動性和寫入資料的讀取的比率。這可以幫助您改進和優化您的索引策略。例如,如果您有一個表,是相當靜態 (很少寫入任何索引),你可能會更有信心有關新增更多的索引在你失蹤的索引查詢中列中。

 

如果您使用的是 SQL Server 2008 企業版,此查詢可以幫助您決定是否會啟用資料壓縮 (頁或行) 的好主意。具有很少寫活動的索引很可能是更合適資料壓縮比波動性更大的索引。


 

查詢未使用的索引 

-- =============================================
-- Description: 查詢當前資料庫中所有未使用的索引,知道你進行優化的參考。本sql的意思是,表的索引在資料庫中未被使用,作為你進行下一步刪除的依據。其中也可以加入時間判斷
--List unused indexes
-- =============================================
SELECT OBJECT_NAME(i.[object_id]) AS [Table Name] ,
i.name
FROM sys.indexes AS i    
INNER JOIN sys.objects AS o ON i.[object_id] = o.[object_id]
WHERE i.index_id NOT IN
(
 SELECT s.index_id
 FROM sys.dm_db_index_usage_stats AS s    
 WHERE s.[object_id] = i.[object_id]
 AND i.index_id = s.index_id
 AND database_id = DB_ID() 
 
 --下列條件作為時間判斷,檢視在某個時間之後未使用的索引列表,如果不需要可刪除
 
AND
 (
 last_user_seek>='@DateTime' or   --使用者上次執行搜尋時間
 last_user_scan>='@DateTime' or   --使用者上次執行掃描時間
 last_system_seek>='@DateTime' or --系統上次執行搜尋的時間
 last_system_scan>='@DateTime'    --系統上次執行掃描的時間
 )
)
AND o.[type] = 'U'
ORDER BY OBJECT_NAME(i.[object_id]) ASC

 

查詢當前資料庫中使用較少的索引或者寫入次數大於讀取次數的索引 

 

-- =============================================
-- Description: 查詢當前資料庫中使用較少的索引或者寫入次數大於讀取次數的索引,
--此查詢會尋找有大量的零的讀取和寫入的任何索引。任何屬於此類別的索引是刪除 (在充分調查) 的合適選擇,指導你進行優化的參考。
--Possible Bad NC Indexes (writes > reads)
-- =============================================
SELECT OBJECT_NAME(s.[object_id]) AS [Table Name] ,
i.name AS [Index Name] , --索引名稱
i.index_id ,
user_updates AS [Total Writes] ,--寫入次數
user_seeks + user_scans + user_lookups AS [Total Reads] ,--讀取次數
user_updates - ( user_seeks + user_scans + user_lookups ) AS [Difference]--寫入與讀取只差
FROM sys.dm_db_index_usage_stats AS s WITH ( NOLOCK )
INNER JOIN sys.indexes AS i WITH ( NOLOCK ) ON s.[object_id] = i.[object_id] AND i.index_id = s.index_id
WHERE
OBJECTPROPERTY(s.[object_id], 'IsUserTable') = 1
AND s.database_id = DB_ID()
AND user_updates > (user_seeks + user_scans + user_lookups )
AND i.index_id > 1 --聚集索引和非聚集索引
ORDER BY [Difference] DESC ,
[Total Writes] DESC ,
[Total Reads] ASC ;

 

 
 

相關文章