高密度の2つの列があるが、これらの列が独立していない状況を考えています。
定義
これが、テスト目的で作成したテーブルの定義です。
CREATE TABLE [dbo].[StatsTest](
[col1] [int] NOT NULL, --can take values 1 and 2 only
[col2] [int] NOT NULL, --can take integer values from 1 to 4 only
[col3] [int] NOT NULL, --integer. it has not relevance just to ensure that each row is different
[col4] AS ((10)*[col1]+[col2]) --a computed column ensuring that if two rows have different values in col1 or col2 have different values in col4
) ON [PRIMARY]
データ
実験のデータは次のとおりです
col1 col2 col3 col4
1 1 1 11
1 2 2 12
1 2 3 12
1 3 4 13
1 3 5 13
1 3 6 13
1 4 7 14
1 4 8 14
1 4 9 14
1 4 10 14
2 1 11 21
2 1 12 21
2 1 13 21
2 1 14 21
2 2 15 22
2 2 16 22
2 2 17 22
2 3 18 23
2 3 19 23
2 4 20 24
ステップ1:col1によるフィルタリング
SELECT * FROM StatsTest WHERE col1=1
予想どおり、Query Optimizerは正確な行数を推測します。
ステップ2:col2によるフィルタリング
SELECT * FROM StatsTest WHERE col2=1
繰り返しますが、完全な推定値があります。
ステップ3:col1およびcol2によるフィルタリング
SELECT * FROM StatsTest WHERE col1=1 AND col2=1
ここで、推定は実際の行数に近いものではありません。
問題は、クエリアナライザーの暗黙では、col1とcol2が独立しているが、独立していると仮定していることです。
ステップ4:col4によるフィルタリング
SELECT * FROM StatsTest WHERE col4 = 11
col4は計算列であり、定義された方法に従ってcol1 = 1であり、col2 = 1はcol4 = 11と同等であるため、col4 = 11 でフィルター処理して、ステップ3のクエリと同じ結果を得ることができます。ただし、 、予想どおり推定は完璧です。
結論/質問
¿この人為的で洗練されていないソリューションは、独立した2つ以上の列によるフィルタリングを処理する場合に正確な推定を達成するための唯一の利用可能なオプションですか?¿計算列と計算列によるフィルターは、実際の精度を得るために厳密に必要ですか?