밀도가 높은 두 개의 열이 있지만이 열은 독립적이지 않은 상황을 생각하고 있습니다.
정의
테스트 목적으로 만든 테이블의 정의입니다.
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 단계의 쿼리와 동일한 결과를 얻을 수 있습니다. 예상대로 예상이 완벽합니다.
결론 / 질문
¿이 인공적이고 우아한 솔루션은 독립적이지 않은 두 개 이상의 열로 필터링을 처리 할 때 정확한 추정을 달성 할 수있는 유일한 옵션입니까? ¿ 실제 정밀도를 얻기 위해 계산 열과 계산 열에 의한 필터가 반드시 필요한가?