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

使用自增長鍵列值的統計信息

數據庫 SQL Server
今天的文章里我想談下SQL Server里非常普遍的問題:如何處理用自增長鍵列的統計信息。我們都知道,在SQL Server里每個統計信息對象都有關聯的直方圖。直方圖用多個步長描述指定列數據分布情況。在一個直方圖里,SQL Server最大支持200的步長,但當你查詢的數據范圍在直方圖最后步長后,這是個問題。我們來看下面的代碼,重現這個情形:

 

今天的文章里我想談下SQL Server里非常普遍的問題:如何處理用自增長鍵列的統計信息。我們都知道,在SQL Server里每個統計信息對象都有關聯的直方圖。直方圖用多個步長描述指定列數據分布情況。在一個直方圖里,SQL Server***支持200的步長,但當你查詢的數據范圍在直方圖***步長后,這是個問題。我們來看下面的代碼,重現這個情形: 

  1. -- Create a simple orders table 
  2. CREATE TABLE Orders 
  3.     OrderDate DATE NOT NULL
  4.     Col2 INT NOT NULL
  5.     Col3 INT NOT NULL 
  6. GO 
  7.  
  8. -- Create a Non-Unique Clustered Index on the table 
  9. CREATE CLUSTERED INDEX idx_CI ON Orders(OrderDate) 
  10. GO 
  11.  
  12. -- Insert 31465 rows from the AdventureWorks2008r2 database 
  13. INSERT INTO Orders (OrderDate, Col2, Col3) SELECT OrderDate, CustomerID, TerritoryID FROM AdventureWorks2008R2.Sales.SalesOrderHeader 
  14. GO 
  15.  
  16. -- Rebuild the Clustered Index, so that we get fresh statistics. 
  17. -- The last value in the Histogram is 2008-07-31. 
  18. ALTER INDEX idx_CI ON Orders REBUILD 
  19. GO 
  20.  
  21. -- Insert 200 additional rows *after* the last step in the Histogram 
  22. INSERT INTO Orders (OrderDate, Col2, Col3) 
  23. VALUES ('20100101', 1, 1) 
  24. GO 200 

在索引重建后,我們再看下直方圖,我們發現***步進的值是2008-07-31。

  1. 1 DBCC SHOW_STATISTICS('dbo.Orders''idx_CI'WITH HISTOGRAM 

 

  你已經看到,在***步進到表里后,我們插入了200條額外記錄。這樣的話,直方圖并沒有真實反饋實際的數據分布情況,但SQL Server還是要進行基數計算。我們現在來看看在不同版本里SQL Server是如何處理這個問題的。

  SQL Server 2005 SP1- SQL Server 2012

  在SQL Server 2014之前,基數計算對此問題的處理非常簡單:SQL Server估計行數為1,你可以從下面的圖片里看到。

  點擊工具欄的[[141954]]顯示包含實際的執行計劃,并執行如下查詢:

 

 

  1. SELECT * FROM dbo.Orders WHERE OrderDate='2010-01-01' 

  

 

  自SQL Server 2005 SP1起,查詢優化器可以標記1列為自增長(Ascending)來克服剛才介紹的限制。如果你用自增長列值更新了統計信息對象3次,那列就會被標記為自增長列。為了看有沒有列標記為自增長,你可以使用跟蹤標記2388。當你啟用這個跟蹤標記,DBCC SHOW_STATISTICS的輸出就改變了,有額外列返回。

 

  1. DBCC TRACEON(2388) 
  2. DBCC SHOW_STATISTICS('dbo.Orders''idx_CI'

 

 

  現在下面的代碼更新統計信息3次,每次用自增長鍵列值在我們聚集索引末尾插入行。

 

  1. -- => 1st update the Statistics on the table with a FULLSCAN 
  2. UPDATE STATISTICS Orders WITH FULLSCAN 
  3. GO 
  4.  
  5. -- Insert 200 additional rows *after* the last step in the Histogram 
  6. INSERT INTO Orders (OrderDate, Col2, Col3) 
  7. VALUES ('20100201', 1, 1) 
  8. GO 200 
  9.  
  10. -- => 2nd update the Statistics on the table with a FULLSCAN 
  11. UPDATE STATISTICS Orders WITH FULLSCAN 
  12. GO 
  13.  
  14. -- Insert 200 additional rows *after* the last step in the Histogram 
  15. INSERT INTO Orders (OrderDate, Col2, Col3) 
  16. VALUES ('20100301', 1, 1) 
  17. GO 200 
  18.  
  19. -- => 3rd update the Statistics on the table with a FULLSCAN 
  20. UPDATE STATISTICS Orders WITH FULLSCAN 
  21. GO 

 

  然后,當我們執行DBCC SHOW_STATISTICS命令,你會看到SQL Server已講那列標記為Ascending。

 

  1. DBCC TRACEON(2388) 
  2. DBCC SHOW_STATISTICS('dbo.Orders''idx_CI'

 

  

 

  現在當你再次執行查詢不是直方圖范圍的數據時,沒有任何改變。為了使用標記為自增長鍵列,你要啟用另外一個跟蹤標記-2389。如果你啟用這個跟蹤標記,查詢優化器就是密度向量(Density Vector)來進行基數計算。

 

  1. -- Now we query the newly inserted range which is currently not present in the Histogram. 
  2. -- With Trace Flag 2389, the Query Optimizer uses the Density Vector to make the Cardinality Estimation. 
  3. SELECT * FROM Orders 
  4. WHERE OrderDate = '20100401' 
  5. OPTION (RECOMPILE, QUERYTRACEON 2389) 
  6. GO 

 

  來看下現在的表密度:

 

  1. DBCC TRACEOFF(2388) 
  2. DBCC SHOW_STATISTICS('dbo.Orders''idx_CI'

 

 

  現在的表密度是0.0008873115,因此查詢優化器的估計行數是28.4516:0.0008873115*(32265-200)。

  

 

  這雖然不是***的結果,但比估計行數1好很多!

  (這里有問題,我本地是SQL Server 2008r2,測試估計行數還是1,不知原因,望知道的朋友解釋下,多謝!

  


  SQL Server 2014

  在SQL Server 2014引入的一個新功能是新基數計算。新基數計算對于自增長鍵問題的處理非常簡單:默認不使用任何跟蹤標記,來使用統計信息對象的密度向量來進行基數計算。下面查詢啟用2312跟蹤標記的基數計算來運行同個查詢。

 

  1. -- With the new Cardinality Estimator SQL Server estimates 28.4516 rows at the Clustered Index Seek operator. 
  2. SELECT * FROM Orders 
  3. WHERE OrderDate = '20100401' 
  4. OPTION (RECOMPILE, QUERYTRACEON 2312) 
  5. 5 GO 

 

  我們來看這里的基數計算,你會看到查詢優化器再次估計行數是28.4516,但這一次沒表上自增長。這是SQL Server 2014的自帶功能。

  (SQL Server 2014測試失敗,估計行數也是1……)

  小結

  在這篇文章,我向你展示了SQL Server的查詢優化器如何處理自增長鍵問題。在SQL Server 2014之前,你需要啟用2389跟蹤標記來獲得更好的基數計算——這樣的話那列會標記為自增長(ascending)。SQL Server 2014,查詢優化器默認就使用密度向量來進行基數計算,這樣就方便很多。我希望你對此有所收獲,在SQL Server里如何處理自增長鍵列問題你會有更好的想法。

  感謝關注!

  注:此文章為WoodyTu學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出此文鏈接!

 

  若您覺得這篇文章還不錯請點擊下右下角的推薦,有了您的支持才能激發作者更大的寫作熱情,非常感謝!

責任編輯:honglu 來源: 博客園
相關推薦

2010-11-16 14:15:16

oracle標識列

2010-11-22 10:29:42

MySQL字段自增長

2011-08-25 13:59:45

Access自增長字段SQL Server

2019-05-23 08:00:00

Webalizer網站統計開源

2021-07-06 14:27:34

Tokei編程語言

2021-10-25 10:33:26

smem 命令Linux

2009-03-12 17:51:08

日志宕機SQL Server

2011-03-14 09:33:09

2010-10-20 10:04:36

sql server自

2023-05-06 07:43:43

MySQL統計數據

2010-06-28 09:59:47

SQL Server自

2022-11-09 09:54:18

2010-08-19 14:54:07

DB2 優化器

2022-12-13 10:05:13

MySQL數據庫

2023-12-28 18:02:12

2010-07-22 10:38:12

SQL Server所

2011-04-21 10:06:40

SQL篩選

2010-09-09 10:37:39

CSSdiv列高度

2010-05-12 09:42:24

MySQL 列值比較

2010-11-16 13:54:47

Oracle標識列
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人小视频 | 亚洲视频精品 | 亚洲精品欧美 | 欧美三级在线 | 欧美亚洲成人网 | 精品国产一级片 | 日韩av在线中文字幕 | 久久精品一区 | 欧美国产日韩一区二区三区 | 成人午夜 | 国产成人艳妇aa视频在线 | 亚洲高清视频在线观看 | 天天操天天摸天天干 | 国产成人久久精品一区二区三区 | 亚洲国产精品久久久久久 | 91看片网 | 91免费视频| 毛色毛片免费看 | 国产精品视频久久久久 | 亚洲视频一区在线观看 | 日韩视频三区 | 999观看免费高清www | 成人久久久久 | 欧美 日韩精品 | 男女羞羞免费视频 | 亚洲区一区二 | 国产欧美一区二区三区在线看 | 日韩在线免费视频 | 亚洲第一成人影院 | 99成人精品 | 日本三级全黄三级三级三级口周 | 国产精品视频播放 | 国产精品日韩在线 | 91亚洲精品在线 | 国产网站在线免费观看 | 91国产精品 | 蜜桃传媒一区二区 | 成人免费在线观看 | 国产欧美一区二区精品久导航 | 欧美成人免费在线视频 | www.久草.com |