我想問一下SQL Server如何估計下面的查詢中的那些行,如果它使用直方圖來計算估計行,它是如何做的。任何提示或鏈接的答案是非常感謝。用SQL Server統計直方圖估計範圍謂詞
use AdventureWorks2012
go
select *
from sales.SalesOrderDetail
where SalesOrderID between 43792 and 44000
option (recompile)
我想問一下SQL Server如何估計下面的查詢中的那些行,如果它使用直方圖來計算估計行,它是如何做的。任何提示或鏈接的答案是非常感謝。用SQL Server統計直方圖估計範圍謂詞
use AdventureWorks2012
go
select *
from sales.SalesOrderDetail
where SalesOrderID between 43792 and 44000
option (recompile)
SQLSERVER構造柱的統計數據基於該直方圖可以得出:分析該列中的數據分佈和估計
讓舉一個小例子來理解數據更多..
drop table t1
create table t1
(
id int
)
insert into t1
select top 300 row_number() over(order by t1.number) as N
from master..spt_values t1
cross join master..spt_values t2
go 3
select * from t1 where id=1
dbcc show_statistics('t1','_WA_Sys_00000001_29572725')
DBCC給我下面historgram
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
1 0 3 0 1
3 3 3 1 3
4 0 3 0 1
6 3 3 1 3
8 3 3 1 3
10 3 3 1 3
以上是DBCC的剪斷output.Before跳進解釋什麼是那些mean.Lets瞭解數據是如何分佈在表
有1 300行300,重複3 times.So行的總數是900
現在讓我們瞭解這些列的含義
RANGE_HI_KEY:
SQL服務器在本列中使用的值作爲鍵頂部構建直方圖,由於直方圖僅限於200 steps..It選擇用於構建直方圖..this 行會被限制在200 steps.in這種情況下的值是1,3,4,6等
RANGE_ROWS:
此數字表示步驟內的是比以前的頂部密鑰和當前鍵頂更高的行數,但不等於兩者。
行> 1和< 3等
EQ_ROWS:
指定有多少行是完全相同equa1到。在這種情況下最高值,這是= 1,3等等
DISTINCT_RANGE_ROWS:
這些是一個步驟內的行的重複計數。如果所有行都是唯一的,則RANGE_ROWS和DISTINCT_RANGE_ROWS將相等。
不同行,其中值> 1和< 3等
AVG_RANGE_ROWS:
這代表行等於所述步驟中的關鍵值,這意味着行的平均數量的平均數等於頂級鍵即。,1,3等
**一些演示查詢**
select * from id=1
我們知道EQ_ROWS 1具有值3,所以你可以看到的估計行的3
這是對於簡單的等於查詢,但它是如何爲多個謂詞像一個工作你的情況..
巴特鄧肯提供了一些見解
優化程序有多種估算基數的方法,其中沒有一種是完全萬無一失的。
如果謂詞很簡單,如「column = 123」,並且搜索值恰好是直方圖端點(RANGE_HI_KEY),則EQ_ROWS可用於非常準確的估計。
如果搜索值碰巧落在兩個步驟端點之間,那麼該特定直方圖步驟中的值的平均密度用於估計謂詞選擇性和操作符基數。
如果在編譯時未知道特定的搜索值,則下一個最佳選項是使用平均列密度(「所有密度」),該平均列密度可用於計算將與平均值匹配的行數該列。
在某些情況下,以上都不可能,優化器不得不求助於基於「幻數」的估計。例如,可能會完全猜測10%的行將被返回,其中「10%」值將在優化器代碼中硬編碼,而不是從統計信息派生。
進一步參考和閱讀:
https://sqlperformance.com/2014/01/sql-plan/cardinality-estimation-for-multiple-predicates
https://blogs.msdn.microsoft.com/bartd/2011/01/25/query-tuning-fundamentals-density-predicates-selectivity-and-cardinality/
感謝您的支持,您的答案是不是真正的我所期待的,但是從你的提示,我能猜出自己。實際上,我的問題還不夠清楚,真正的問題是謂詞落在兩步之間(兩個RANGE_HI_KEY值)如何計算估計的行數?查詢看起來像 select * from sales.SalesOrderDetail where SalesOrderID <43660 我說「猜」,因爲我沒有找到任何文章談這件事,但我發現SQL Server可能會使用插值方法做? ? – Lukas85
如果我們無法確切知道SQL Server使用哪個公式? – Lukas85