0

ヒストグラムを使用して見積もり行を計算すると、どのようにSQL Serverがこれらの行を見積もることができるか質問したいと思います。回答へのヒントやリンクは非常に感謝しています。列のSQL Serverの統計ヒストグラムで範囲の述語を推定する

use AdventureWorks2012 
go 
select * 
from sales.SalesOrderDetail 
where SalesOrderID between 43792 and 44000 
option (recompile) 

this is execution plan

this is statistics info

答えて

1

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 

の下に私を与えたものmean.Letsは、データが表に

をどのように分配されるか、1〜300行が理解してどのような説明に飛び込むDBCC output.Beforeのスニップです300は、行の3 times.So総数は900

で重複

は今、それらの列が何を意味するかを理解することができます

RANGE_HI_KEY

ヒストグラムはわずか200ステップに制限されているため、SQL Serverはこの列の値をヒストグラムとして使用します。これはヒストグラムの作成に使用される 行を選択します。この場合は200ステップに制限されます。値は、1,3,4,6-ので

RANGE_ROWSにある:この番号は、前頂キーと現在のトップキーより大きいステップ内の行の数を示す

、しかしいずれにも等しくない。

行> 1と< 3とそう

EQ_ROWS上:

は、多くの行が正確にequa1この場合.INトップ値にあるかを指定し、それが3、= 1ですので

DISTINCT_RANGE_ROWS:

これらは、ステップ内の行の明確な数です。すべての行が一意の場合、RANGE_ROWSとDISTINCT_RANGE_ROWSは等しくなります。

異なる行値> 1および

AVG_RANGE_ROWSに< 3等:

これは、行の平均数を意味するステップ、内のキー値に等しい行の平均数を表します。トップキーieに等しい。、

**いくつかのデモのクエリに1,3など**

select * from id=1 

私たちは、あなたがこれは3

と推定行を見ることができるように、1のためEQ_ROWSは、3の値を持って知っていますシンプル同じクエリに対して、それはあなたのケース内の1つのような複数の述語のために働くんか...

バートダンカンは、いくつかの洞察を提供し

オプティマイザには、カーディナリティを推定するための方法がいくつか用意されていますが、いずれも完全に安全です。

述語が "column = 123"のように単純で、検索値がヒストグラムエンドポイント(RANGE_HI_KEY)である場合、EQ_ROWSは非常に正確な見積もりに使用できます。

検索値は、2つのステップのエンドポイント間で落下する場合は、その特定のヒストグラムのステップの値の平均濃度は、述語の選択及びオペレータカーディナリティを推定するために使用されます。

コンパイル時に特定の検索値がわからない場合は、平均列密度(「すべての密度」)を使用して、平均値と一致する行数を計算します列。

いくつかのケースでは上記のいずれもが不可能であると、オプティマイザは、「マジックナンバー」ベースの推定に頼らなければなりません。たとえば、行の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/

+0

おかげで、あなたの答えは私が期待したもの、本当にありませんが、あなたのヒントから、私は自分自身のための答えを推測することができます。実際には、私の質問は十分に明確ではなかった、実際の質問は、述語が2つのステップ(2つのRANGE_HI_KEY値)の間にあるときに、どのように推定行カウントを計算できるかということです。クエリは次のようになります select * sales.SalesOrderDetail SalesOrderID <43660 私はこれについての記事を見つけられなかったので「推測」と言いましたが、SQL Serverが補間方法を使用する可能性があります。 ? – Lukas85

+0

その場合、SQL Serverで使用されている式がわかりませんでしたか? – Lukas85

関連する問題