Tôi đang nghĩ đến một tình huống mà tôi có hai cột với mật độ cao nhưng các cột này không độc lập.
Định nghĩa
Đây là định nghĩa của bảng mà tôi đã tạo cho mục đích thử nghiệm.
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]
Dữ liệu
Dữ liệu cho thí nghiệm như sau
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
Bước 1: Lọc theo col1
SELECT * FROM StatsTest WHERE col1=1
Như mong đợi, Trình tối ưu hóa truy vấn sẽ đoán chính xác số lượng hàng.
Bước 2: Lọc theo col2
SELECT * FROM StatsTest WHERE col2=1
Một lần nữa chúng ta có một ước tính hoàn hảo.
Bước 3: Lọc theo col1 và col2
SELECT * FROM StatsTest WHERE col1=1 AND col2=1
Ở đây ước tính không phải là gần với số lượng hàng thực tế.
Vấn đề là hàm ẩn của trình phân tích truy vấn giả định rằng col1 và col2 là độc lập nhưng thực tế thì không.
Bước 4: Lọc theo col4
SELECT * FROM StatsTest WHERE col4 = 11
Tôi có thể lọc theo col4 = 11 để có kết quả giống như truy vấn trong Bước 3, vì col4 là cột được tính toán và theo cách nó đã được xác định col1 = 1 và col2 = 1 tương đương với col4 = 11 Tuy nhiên, ở đây , như dự đoán là ước tính là hoàn hảo.
Kết luận / câu hỏi
Solution Đây có phải là giải pháp nhân tạo và không phù hợp là lựa chọn khả dụng duy nhất để đạt được ước tính chính xác khi xử lý lọc bằng hai hoặc nhiều cột không độc lập? Cột được tính toán và bộ lọc bằng cột được tính có cần thiết để đạt được độ chính xác thực tế không?
Ví dụ trong sqlfiddle