成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

首先讓我們創建一個表并插入一些測試數據:

  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 

然后我們做一個簡單的查詢:

  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.

檢查這個執行計劃以及索引檢索的屬性,你會發現預估行數是實際行數的兩倍,但并不會太影響執行計劃,因為優化器選擇了最合適的查詢方法:

 

 

 

 

查詢優化器根據基本統計直方圖來預估數據行數,即:EQ_ROWS + AVG_RANGE_ROWS (77 + 88.64286) DBCC SHOW_STATISTICS ('dbo.TempTable', IX_tempDateTime) 

 

 

現在我們修改 SELECT 語句以使用局部變量,你會發現查詢優化器使用了一個不同的查詢計劃,這是一個更耗時的計劃,為什么?

  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. 

 

 

預估值和實際值差別更大,相當于查詢優化器無法選擇最適合的查詢計劃,因為錯誤的預估值。因為查詢優化在執行時并不清楚局部變量值,導致無法使用統計直方圖。

不等式運算符的情況

在我們的查詢中使用的不等式運算符,因此查詢優化器使用了一個簡單的 30% 的算式來預估。

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

等式運算符的情況

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

如果在局部變量中使用等式運算符,那么查詢優化器又會選擇不同的公式,即 精確度 * 表記錄總數. 執行下面查詢可獲取精確的值

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

原文鏈接:http://www.oschina.net/question/12_60607

責任編輯:林師授 來源: OSCHINA
相關推薦

2024-07-09 08:35:09

2009-09-17 13:05:38

Linq局部變量類型

2020-11-11 21:26:48

函數變量

2009-08-26 16:37:07

C#迭代器局部變量

2010-03-15 09:32:56

Python函數

2024-05-29 08:49:22

Python全局變量局部變量

2018-05-14 09:15:24

Python變量函數

2015-01-07 14:41:32

Android全局變量局部變量

2009-09-11 10:07:05

Linq隱式類型化局部

2009-10-12 14:13:00

VB.NET使用局部變

2020-10-26 07:07:50

線程安全框架

2017-02-08 12:28:37

Android變量總結

2009-12-15 10:48:54

Ruby局部變量

2009-09-22 17:21:24

線程局部變量

2009-08-27 10:08:36

C#隱含類型局部變量

2021-09-28 07:12:09

函數內存

2010-10-14 09:34:34

JVM局部變量

2009-03-06 09:42:16

性能索引

2021-07-01 10:45:08

硬盤數據庫性能

2011-11-23 10:59:18

Javafinal
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人精品一区二区男人看 | 日韩一区二区福利 | 中文字幕av在线播放 | 国产成人叼嘿视频在线观看 | 国产精品a久久久久 | 日韩成人国产 | 国产视频精品视频 | 久久99这里只有精品 | 亚洲精品一区二区三区蜜桃久 | 国产精品有限公司 | 国产又爽又黄的视频 | 中文字幕亚洲精品 | 91av在线影院 | h视频免费观看 | 国产精品九九视频 | www.国产精品 | 一区二区三区四区不卡 | 成人在线免费 | 日韩亚洲视频 | 久久9热| 天天久 | 91.com视频| 亚洲国产激情 | 国产精品免费一区二区三区四区 | 日韩精品免费在线观看 | 九九爱这里只有精品 | 国产精品久久久亚洲 | 91视频精选| 狠狠爱综合 | 免费在线视频a | ww 255hh 在线观看| 夜夜夜夜夜夜曰天天天 | 精品国产一区二区三区免费 | 毛片视频免费 | 亚洲激情在线观看 | 黄色电影在线免费观看 | 另类一区 | 精品一区二区三 | 亚洲一区二区在线播放 | 欧美区日韩区 | 亚洲人成人一区二区在线观看 |