SQL Server: 局部變量是如何影響查詢性能的 |
發布時間: 2012/8/4 17:04:55 |
數據庫開發者在存儲過程和腳本中使用局部變量是很常見的事情,但是,局部變量會影響查詢的性能,接下來我們來證實這一點。
首先讓我們創建一個表并插入一些測試數據:
然后我們做一個簡單的查詢:
Table 'TempTable'. Scan count 1, logical reads 80, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 檢查這個執行計劃以及索引檢索的屬性,你會發現預估行數是實際行數的兩倍,但并不會太影響執行計劃,因為優化器選擇了最合適的查詢方法:
查詢優化器根據基本統計直方圖來預估數據行數,即:EQ_ROWS + AVG_RANGE_ROWS (77 + 88.64286) DBCC SHOW_STATISTICS ('dbo.TempTable', IX_tempDateTime)
現在我們修改 SELECT 語句以使用局部變量,你會發現查詢優化器使用了一個不同的查詢計劃,這是一個更耗時的計劃,為什么?
------------------------------------------------------------------------------------------ Table 'TempTable'. Scan count 1, logical reads 481, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
預估值和實際值差別更大,相當于查詢優化器無法選擇最適合的查詢計劃,因為錯誤的預估值。因為查詢優化在執行時并不清楚局部變量值,導致無法使用統計直方圖。
不等式運算符的情況
在我們的查詢中使用的不等式運算符,因此查詢優化器使用了一個簡單的 30% 的算式來預估。
Estimated Rows =(Total Rows * 30)/100 = (100000*30)/100 = 30000
等式運算符的情況
如果在局部變量中使用等式運算符,那么查詢優化器又會選擇不同的公式,即 精確度 * 表記錄總數. 執行下面查詢可獲取精確的值 DBCC SHOW_STATISTICS('dbo.TempTable', IX_tempDateTime)
All Density = 0.0007358352 Total Number of Rows in Table = 100000
Estimated Rows = Density * Total Number = 0.0007358352 * 100000 = 73.5835 本文出自:億恩科技【www.laynepeng.cn】 |