亚洲综合社区欧美综合色-欧美逼逼一区二区三区-国产老熟女高潮精品网站-国产日韩最新视频在线看

始創(chuàng)于2000年 股票代碼:831685
咨詢熱線:0371-60135900 注冊(cè)有禮 登錄
  • 掛牌上市企業(yè)
  • 60秒人工響應(yīng)
  • 99.99%連通率
  • 7*24h人工
  • 故障100倍補(bǔ)償
全部產(chǎn)品
您的位置: 網(wǎng)站首頁(yè) > 幫助中心>文章內(nèi)容

SQL Server: 局部變量是如何影響查詢性能的

發(fā)布時(shí)間:  2012/8/4 17:04:55
數(shù)據(jù)庫(kù)開(kāi)發(fā)者在存儲(chǔ)過(guò)程和腳本中使用局部變量是很常見(jiàn)的事情,但是,局部變量會(huì)影響查詢的性能,接下來(lái)我們來(lái)證實(shí)這一點(diǎn)。
首先讓我們創(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  = ONON [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

本文出自:億恩科技【1tcdy.com】

服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經(jīng)營(yíng)性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經(jīng)營(yíng)性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經(jīng)營(yíng)性ICP/ISP證:贛B2-20080012
  • 服務(wù)器/云主機(jī) 24小時(shí)售后服務(wù)電話:0371-60135900
  • 虛擬主機(jī)/智能建站 24小時(shí)售后服務(wù)電話:0371-60135900
  • 專(zhuān)注服務(wù)器托管17年
    掃掃關(guān)注-微信公眾號(hào)
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號(hào)總部企業(yè)基地億恩大廈  法律顧問(wèn):河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號(hào)
      1
     
     
     
     

    0371-60135900
    7*24小時(shí)客服服務(wù)熱線