新聞中心
數(shù)據(jù)庫開發(fā)者在存儲過程和腳本中使用局部變量是很常見的事情,但是,局部變量會影響查詢的性能,接下來我們來證實這一點。

10年的桐鄉(xiāng)網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整桐鄉(xiāng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“桐鄉(xiāng)網(wǎng)站設(shè)計”,“桐鄉(xiāng)網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
首先讓我們創(chuàng)建一個表并插入一些測試數(shù)據(jù):
- USE AdventureWorks
- GO
- CREATE TABLE TempTable
- (tempID UNIQUEIDENTIFIER,tempMonth INT, tempDateTime DATETIME )
- GO
- INSERT INTO TempTable (tempID, tempMonth, tempDateTime)
- SELECT NEWID(),(CAST(100000*RAND() AS INT) % 12) + 1 ,GETDATE()
- GO 100000 -- (EXECUTE THIS BATCH 100000 TIME)
- -- Create an index to support our query
- CREATE NONCLUSTERED INDEX [IX_tempDateTime] ON [dbo].[TempTable]
- ([tempDateTime] ASC)
- INCLUDE ( [tempID]) WITH ( ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
- GO
然后我們做一個簡單的查詢:
- SET STATISTICS IO ON
- GO
- SELECT * FROM TempTable
- WHERE tempDateTime > '2012-07-10 03:18:01.640'
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.
檢查這個執(zhí)行計劃以及索引檢索的屬性,你會發(fā)現(xiàn)預(yù)估行數(shù)是實際行數(shù)的兩倍,但并不會太影響執(zhí)行計劃,因為優(yōu)化器選擇了最合適的查詢方法:
查詢優(yōu)化器根據(jù)基本統(tǒng)計直方圖來預(yù)估數(shù)據(jù)行數(shù),即:EQ_ROWS + AVG_RANGE_ROWS (77 + 88.64286) DBCC SHOW_STATISTICS ('dbo.TempTable', IX_tempDateTime)
現(xiàn)在我們修改 SELECT 語句以使用局部變量,你會發(fā)現(xiàn)查詢優(yōu)化器使用了一個不同的查詢計劃,這是一個更耗時的計劃,為什么?
- DECLARE @RequiredDate DATETIME
- SET @RequiredDate = '2012-07-10 03:18:01.640'
- SELECT * FROM TempTable
- WHERE tempDateTime > @RequiredDate
------------------------------------------------------------------------------------------
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.
預(yù)估值和實際值差別更大,相當(dāng)于查詢優(yōu)化器無法選擇最適合的查詢計劃,因為錯誤的預(yù)估值。因為查詢優(yōu)化在執(zhí)行時并不清楚局部變量值,導(dǎo)致無法使用統(tǒng)計直方圖。
不等式運算符的情況
在我們的查詢中使用的不等式運算符,因此查詢優(yōu)化器使用了一個簡單的 30% 的算式來預(yù)估。
Estimated Rows =(Total Rows * 30)/100 = (100000*30)/100 = 30000
等式運算符的情況
- DECLARE @RequiredDate DATETIME
- SET @RequiredDate = '2012-07-10 03:18:01.640'
- SELECT * FROM TempTable
- WHERE tempDateTime = @RequiredDate
如果在局部變量中使用等式運算符,那么查詢優(yōu)化器又會選擇不同的公式,即 精確度 * 表記錄總數(shù). 執(zhí)行下面查詢可獲取精確的值
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
英文原文:http://www.connectsql.blogspot.tw/2012/07/sql-server-how-local-variables-can.html
文章題目:SQL Server: 局部變量是如何影響查詢性能的
網(wǎng)頁鏈接:http://www.dlmjj.cn/article/dhsejee.html


咨詢
建站咨詢
