一、如何打開執行計劃? 在Microsoft SQL Server Management Studio中打開“包括實際的執行計劃”(快捷鍵:Ctrl+M),執行SQL語句就可以看到實際的執行計劃(圖文格式,非常直觀),這無疑是最友好的查閱方式。 二、如何看懂實際執行計劃? 執行複雜的腳本之後,看到的 ...
一、如何打開執行計劃?
在Microsoft SQL Server Management Studio中打開“包括實際的執行計劃”(快捷鍵:Ctrl+M),執行SQL語句就可以看到實際的執行計劃(圖文格式,非常直觀),這無疑是最友好的查閱方式。
二、如何看懂實際執行計劃?
執行複雜的腳本之後,看到的執行計劃,很多人直接懵圈了,這些圖文到底是什麼含義呢,又該如何優化呢?
下麵將列舉常見的執行計劃操作:
Table Scan(全表掃描):如果你的表數據量非常小,表掃描是可以的,並且可能性能會比其他掃描方式好一些;如果是一張大表,這時你必須要優化索引了。大數據量時,全表掃描,性能消耗是非常明顯的。
Clustered Index Scan(聚集索引掃描):一般來講,此時也應該優化查詢語句和索引。出現聚集索引掃描,可能因為返回數據的行或列過多、或者沒有明確的WHERE條件觸發索引。此類掃描,應當考慮創建合適的索引、增加更加嚴格的返回列限定、縮小查詢的數據範圍以控制返回行數。
Index Seek(索引查找):此時性能是比較好的,表示使用了非聚集索引查找。
Clustered Index Seek(聚集索引查找):使用聚集索引(主鍵)查找,實際上這是SQL Server能做的最快的索引查找類型。
Bookmark Lookup(書簽查找):也是應當考慮優化的。在SELECT、JOIN、WHERE的欄位中都無法使用非聚集索引來滿足查找,查詢優化器不得不使用額外的聚集索引查找滿足查詢需求的欄位此時可能會引起書簽查找,不過查詢優化器可能也會使用Clustered Index Scan來替代書簽查找。還有一個可能引起書簽查找的原因是SELECT * FROM …,所以任何情況下使用SELECT * 都是不建議的。
Stream Aggregate(流聚合):使用了SQLSERVER的聚合函數時,會引起流聚合操作。比如:COUNT,MAX,MIN,AVG,DISTINCT,SUM等。
Compute Scalar(計算標量):使用COUNT計數時,會引起該操作;
Sort(排序):當使用了無索引的欄位排序時,可能會引起Sort操作;此時應該考慮是否需要該排序操作,或採用其他創建索引的欄位排序。如確實無法改變,則建議在排序欄位添加索引。
三、常見的索引優化規則
1,所有的索引優化都是取決於數據量大小,數據量極小時,可不考慮創建索引,創建了索引反而引起性能下降;
2,頻繁查詢、排序或者使用的條件欄位,建議使用索引優化;如:存在自增主鍵時,如果使用創建時間排序,儘量優化為使用主鍵排序;
3,WHERE條件中的表達式儘量放在操作符之後。常見的條件操作符有:=、>、<、!=、BETWEEN AND 等;
舉例:DATEPART(YEAR,CreateTime)>=2017 應該優化為:CreateTime>’2017-01-01 00:00:00’;LEN(ParamValue)=0 應該優化為:0=LEN(ParamValue);
4,存在的值重覆性較高的欄位,不建議創建索引,如:狀態標識列;
5,經常組合使用的多個條件欄位,應該創建複合索引;
6,減少LIKE的使用,LIKE在使用通配符開頭(如:LIKE ‘%A%’)不會使用索引查詢;
7,大欄位禁止創建索引;
8,不能濫用索引,必鬚根據實際需要是創建和維護。索引會引起磁碟和數據維護的開銷,要知道,伺服器的硬碟是非常可貴的。
附:好玩的系統查詢腳本
1,查詢引用了某個字元的資料庫對象,適用於查找使用了某個欄位的存儲過程、視圖等;
SELECT so.name, sc.text FROM dbo.syscomments sc , dbo.sysobjects so
WHERE sc.id = so.id AND sc.text LIKE '%PlatValue%'
--AND so.xtype = 'p' --xtype表示對象類型,p為存儲過程
ORDERBY name
2,查詢某個表的表結構
SELECT sc.name, st.name AS [DataType], sc.prec
FROM syscolumns sc
INNER JOIN systypes st ON st.xusertype = sc.xusertype
WHERE sc.id = OBJECT_ID('PlatParam')