ฉันกำลังคิดถึงสถานการณ์ที่ฉันมีสองคอลัมน์ที่มีความหนาแน่นสูง แต่คอลัมน์เหล่านี้ไม่ได้เป็นอิสระ
คำนิยาม
นี่คือคำจำกัดความของตารางที่ฉันสร้างขึ้นเพื่อวัตถุประสงค์ในการทดสอบ
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
ตามที่คาดไว้เครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาจะคาดเดาจำนวนแถวที่แน่นอน
ขั้นตอนที่ 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 = 11 เพื่อให้ได้ผลลัพธ์เช่นเดียวกับแบบสอบถามในขั้นตอนที่ 3 เนื่องจาก col4 เป็นคอลัมน์ที่คำนวณและตามวิธีที่กำหนดไว้col1 = 1 และ col2 = 1เท่ากับcol4 = 11 ที่ นี่อย่างไรก็ตาม ตามที่คาดไว้การประเมินนั้นสมบูรณ์แบบ
สรุป / คำถาม
artificial โซลูชันประดิษฐ์และไม่เหมาะสมนี้เป็นตัวเลือกเดียวที่มีเพื่อให้ได้การประเมินที่ถูกต้องเมื่อจัดการกับการกรองโดยคอลัมน์สองคอลัมน์หรือมากกว่านั้นไม่เป็นอิสระหรือไม่? ¿คอลัมน์ที่คำนวณและตัวกรองโดยคอลัมน์ที่คำนวณจำเป็นอย่างยิ่งสำหรับการได้รับความแม่นยำจริงหรือไม่?
ตัวอย่างในsqlfiddle