통계. 여러 열 히스토그램이 가능합니까?


13

밀도가 높은 두 개의 열이 있지만이 열은 독립적이지 않은 상황을 생각하고 있습니다.

정의

테스트 목적으로 만든 테이블의 정의입니다.

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는 정확한 행 수를 추측합니다. 실제 행 수 = 10 및 예상 행 수 = 10

2 단계 : col2로 필터링

SELECT * FROM StatsTest WHERE col2=1

다시 한 번 우리는 완벽한 평가를 받았습니다.

실제 행 수 = 5 및 예상 행 수 = 5

3 단계 : col1 및 col2로 필터링

SELECT * FROM StatsTest WHERE col1=1 AND col2=1

여기서 추정은 실제 행 수에 가깝지 않습니다. 실제 행 수 = 1 및 예상 행 수 = 3,53553

문제는 쿼리 분석기의 암시성으로 인해 col1과 col2가 독립적이지만 그렇지 않다고 가정한다는 것입니다.

4 단계 : col4로 필터링

SELECT * FROM StatsTest WHERE col4 = 11

col4는 계산 된 열이며 col1 = 1이고 col2 = 1col4 = 11 과 동일 하므로 col4 = 11로 필터링하여 3 단계의 쿼리와 동일한 결과를 얻을 수 있습니다. 예상대로 예상이 완벽합니다.

실제 행 수 = 1 및 예상 행 수 = 1

결론 / 질문

¿이 인공적이고 우아한 솔루션은 독립적이지 않은 두 개 이상의 열로 필터링을 처리 할 때 정확한 추정을 달성 할 수있는 유일한 옵션입니까? ¿ 실제 정밀도를 얻기 위해 계산 열과 계산 열에 의한 필터가 반드시 필요한가?

sqlfiddle의


col1 / 2에 인덱스를 작성하지 않겠습니까?
LowlyDBA

실제로 나는 작동했지만 작동하지 않았기 때문에 여기에 포함시키지 않았습니다. 히스토그램의 경우 첫 번째 열만 고려되고 밀도는 분포가 아닌 다른 수의 값만 고려합니다.
JGA

답변:


15

여러 열 히스토그램이 가능합니까?

진정한 다차원 히스토그램이 아닙니다.

이 인공적이고 우아한 솔루션이 독립적 인 열이 아닌 둘 이상의 필터링을 처리 할 때 정확한 추정을 달성 할 수있는 유일한 옵션입니까?

SQL Server는 "다중 열"통계를 지원 하지만 첫 번째 명명 된 열의 히스토그램 외에 평균 밀도 (상관) 정보 만 캡처합니다. 평등 비교에만 유용합니다.

평균 밀도 정보는 세부 사항을 캡처하지 않으므로 2 열 통계 오브젝트의 모든 값 쌍에 대해 동일한 선택성 을 얻을 수 있습니다. 경우에 따라 다중 열 통계가 충분할 수도 있고 아무 것도없는 것보다 낫습니다. 다중 열 통계는 다중 열 인덱스에 자동으로 구축됩니다.

SQL Server 버전에 따라 필터링 된 인덱스필터링 된 통계를 사용할 수도 있습니다 .

-- Filtered statistics example
CREATE STATISTICS stats_StatsTest_col2_col1_eq_1
ON dbo.StatsTest (col2)
WHERE col1 = 1;

CREATE STATISTICS stats_StatsTest_col2_col1_eq_2
ON dbo.StatsTest (col2)
WHERE col1 = 2;

또는 인덱싱 된 뷰를 만들 수도 있습니다 (인덱스 및 자체 통계를 지원할 수 있음). 인덱싱 된 뷰는 DATE_CORRELATION_OPTIMIZATION데이터베이스 설정 의 메커니즘으로 , 테이블 간 상관 관계에 거의 사용되지 않는 기능이지만 질문의 정신에 적용됩니다.

계산 된 열과 계산 된 열의 필터가 실제 정밀도를 얻기 위해 반드시 필요한가?

유일한 방법은 아닙니다. 이미 언급 한 것 외에도 계산 열의 정확한 텍스트 정의를 지정할 수 있으며 옵티마이 저는 일반적으로 계산 열의 통계와 일치시킵니다.

다중 열 상관에 대한 가정을 변경하는 추적 플래그도 있습니다. 또한 새 카디널리티 추정기가 활성화 된 SQL Server 2014의 기본 상관 가정이 독립에서 지수 백오 프로 변경되었습니다 (자세한 내용은 여기여기 ). 궁극적으로 이것은 다른 가정입니다. 많은 경우에 더 좋으며 다른 경우에는 더 나쁠 것입니다.

우수한 실행 계획을 얻기 위해 카디널리티 추정의 정확한 정밀도가 항상 필요한 것은 아닙니다. 서로 다른 매개 변수 값에 재사용 할 수있는 계획과 특정 실행에 최적이지만 재사용 할 수없는 계획을 생성하는 것에는 항상 상충 관계가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.