日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
SQL Server: 局部變量是如何影響查詢性能的

數(shù)據(jù)庫(kù)開發(fā)者在存儲(chǔ)過程和腳本中使用局部變量是很常見的事情,但是,局部變量會(huì)影響查詢的性能,接下來(lái)我們來(lái)證實(shí)這一點(diǎn)。

10年的桐鄉(xiāng)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整桐鄉(xiāng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“桐鄉(xiāng)網(wǎng)站設(shè)計(jì)”,“桐鄉(xiāng)網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

首先讓我們創(chuàng)建一個(gè)表并插入一些測(cè)試數(shù)據(jù):

 
 
 
 
  1. USE AdventureWorks  
  2. GO  
  3. CREATE TABLE TempTable  
  4.       (tempID UNIQUEIDENTIFIER,tempMonth INT, tempDateTime DATETIME )  
  5. GO  
  6.  
  7. INSERT INTO TempTable (tempID, tempMonth, tempDateTime)  
  8. SELECT NEWID(),(CAST(100000*RAND() AS INT) % 12) + 1 ,GETDATE()  
  9. GO 100000 -- (EXECUTE THIS BATCH 100000 TIME)  
  10.  
  11. -- Create an index to support our query  
  12. CREATE NONCLUSTERED INDEX [IX_tempDateTime] ON [dbo].[TempTable]  
  13. ([tempDateTime] ASC)  
  14. INCLUDE ( [tempID]) WITH ( ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
  15. GO 

然后我們做一個(gè)簡(jiǎn)單的查詢:

 
 
 
 
  1. SET STATISTICS IO ON 
  2. GO  
  3. SELECT * FROM TempTable  
  4. 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.

檢查這個(gè)執(zhí)行計(jì)劃以及索引檢索的屬性,你會(huì)發(fā)現(xiàn)預(yù)估行數(shù)是實(shí)際行數(shù)的兩倍,但并不會(huì)太影響執(zhí)行計(jì)劃,因?yàn)閮?yōu)化器選擇了最合適的查詢方法:

查詢優(yōu)化器根據(jù)基本統(tǒng)計(jì)直方圖來(lái)預(yù)估數(shù)據(jù)行數(shù),即:EQ_ROWS + AVG_RANGE_ROWS (77 + 88.64286) DBCC SHOW_STATISTICS ('dbo.TempTable', IX_tempDateTime)

現(xiàn)在我們修改 SELECT 語(yǔ)句以使用局部變量,你會(huì)發(fā)現(xiàn)查詢優(yōu)化器使用了一個(gè)不同的查詢計(jì)劃,這是一個(gè)更耗時(shí)的計(jì)劃,為什么?

 
 
 
 
  1. DECLARE @RequiredDate DATETIME  
  2. SET @RequiredDate = '2012-07-10 03:18:01.640' 
  3.  
  4. SELECT * FROM TempTable  
  5. 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ù)估值和實(shí)際值差別更大,相當(dāng)于查詢優(yōu)化器無(wú)法選擇最適合的查詢計(jì)劃,因?yàn)殄e(cuò)誤的預(yù)估值。因?yàn)椴樵儍?yōu)化在執(zhí)行時(shí)并不清楚局部變量值,導(dǎo)致無(wú)法使用統(tǒng)計(jì)直方圖。

不等式運(yùn)算符的情況

在我們的查詢中使用的不等式運(yùn)算符,因此查詢優(yōu)化器使用了一個(gè)簡(jiǎn)單的 30% 的算式來(lái)預(yù)估。

Estimated Rows =(Total Rows * 30)/100 = (100000*30)/100 = 30000

等式運(yùn)算符的情況

 
 
 
 
  1. DECLARE @RequiredDate DATETIME  
  2. SET @RequiredDate = '2012-07-10 03:18:01.640' 
  3.  
  4. SELECT * FROM TempTable  
  5. WHERE tempDateTime  = @RequiredDate 

如果在局部變量中使用等式運(yùn)算符,那么查詢優(yōu)化器又會(huì)選擇不同的公式,即 精確度 * 表記錄總數(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: 局部變量是如何影響查詢性能的
本文URL:http://www.5511xx.com/article/dhsejee.html