Saya memikirkan situasi di mana saya memiliki dua kolom dengan kepadatan tinggi tetapi kolom ini tidak independen.
Definisi
Ini dia definisi dari tabel yang telah saya buat untuk tujuan pengujian.
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]
Data
Data untuk eksperimen adalah sebagai berikut
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
Langkah 1: Memfilter menurut col1
SELECT * FROM StatsTest WHERE col1=1
Seperti yang diharapkan, Pengoptimal Kueri menebak jumlah baris yang tepat.
Langkah 2: Memfilter menurut col2
SELECT * FROM StatsTest WHERE col2=1
Sekali lagi kami memiliki estimasi yang sempurna.
Langkah 3: Memfilter menurut col1 dan col2
SELECT * FROM StatsTest WHERE col1=1 AND col2=1
Di sini estimasi jauh dari mendekati jumlah baris aktual.
Masalahnya adalah bahwa implikator analizer query mengasumsikan bahwa col1 dan col2 adalah independen tetapi tidak.
Langkah 4: Memfilter menurut col4
SELECT * FROM StatsTest WHERE col4 = 11
Saya dapat memfilter menurut col4 = 11 untuk mendapatkan hasil yang sama dengan kueri pada Langkah 3, karena col4 adalah kolom yang dihitung dan menurut cara itu telah didefinisikan col1 = 1 dan col2 = 1 setara dengan col4 = 11 Di sini, namun , seperti yang diharapkan, estimasi ini sempurna.
Kesimpulan / Pertanyaan
¿Apakah solusi buatan dan tidak elegan ini satu-satunya pilihan yang tersedia untuk mencapai estimasi yang akurat ketika berhadapan dengan penyaringan dengan dua atau lebih kolom yang tidak independen? ¿Apakah kolom yang dihitung dan filter oleh kolom yang dihitung benar-benar perlu untuk mendapatkan presisi yang sebenarnya?
Contoh dalam sqlfiddle