SQL Server가 복합 열 통계 히스토그램을 수행하지 않는 이유는 무엇입니까?


10

SQL Server에는 "다중 열 통계"라는 것이 있지만 이것이 의미하는 것은 아닙니다.

다음 샘플 테이블을 살펴 보겠습니다.

CREATE TABLE BadStatistics 
(
    IsArchived BIT NOT NULL,
    Id INT NOT NULL IDENTITY PRIMARY KEY,
    Mystery VARCHAR(200) NOT NULL
);

CREATE NONCLUSTERED INDEX BadIndex 
    ON BadStatistics (IsArchived, Mystery);

이를 통해 두 개의 인덱스에서 두 개의 통계가 생성됩니다.

BadIndex에 대한 통계 :

+--------------+----------------+-------------------------+
| All density  | Average Length | Columns                 |
+--------------+----------------+-------------------------+
| 0.5          | 1              | IsArchived              |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 37             | IsArchived, Mystery     |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 41             | IsArchived, Mystery, Id |
+--------------+----------------+-------------------------+

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 0            | 0          | 24398   | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+
| 1            | 0          | 216602  | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+

클러스터형 인덱스에 대한 통계 :

+--------------+----------------+---------+
| All density  | Average Length | Columns |
+--------------+----------------+---------+
| 4.149378E-06 | 4              | Id      |
+--------------+----------------+---------+

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 1            | 0          | 1       | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+
| 240999       | 240997     | 1       | 240997              | 1              |
+--------------+------------+---------+---------------------+----------------+
| 241000       | 0          | 1       | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+

(저는 행의 약 10 분의 1이 아카이브되지 않은 임의의 샘플 데이터로 테이블을 채웠습니다. 나중에 전체 스캔 통계 업데이트를 실행했습니다.)

2 열 통계의 막대 그래프가 왜 하나의 열만 사용합니까? 나는 많은 사람들이 그것에 대해 쓴 것을 알고 하지 않습니다 하지만 근거는 무엇인가? 이 경우 첫 번째 열에는 두 개의 값만 있기 때문에 전체 히스토그램의 유용성이 떨어집니다. 통계가 그와 같이 임의로 제한되는 이유는 무엇입니까?

이 질문은 완전히 다른 짐승 인 다차원 히스토그램에 대한 것이 아닙니다. 단일 차원 히스토그램에 관한 것입니다. 단일 차원은 각각의 여러 열을 포함하는 튜플입니다.

답변:


8

배경

현재 SQL Server 모델은 단일 열 히스토그램 및 다중 열 밀도 정보 만 사용합니다. 단일 열 히스토그램은 예를 들어 a = 1또는 에 적합한 술어에 대한 선택성을 추정하는 데 사용됩니다 b > 50. 여러 술어가 포함 된 쿼리는 개별 선택도 (가정 포함)를 결합하여 추정 된 전체 선택도를 생성합니다.

예를 들어, 카디널리티 추정 : 밀도 통계 결합을 참조하십시오 .

다중 열 밀도는 다중 등식 술어에 대한 약한 상관 정보와 집계에 대한 그룹화 카디널리티를 제공하여 모델에 추가로 정보를 제공합니다.

인덱스와 관련된 통계는 해당 모델에 대한 기회 추가 기능입니다. 엔진은 인덱스를 작성하는 동안 통계 (일반적으로 전체 스캔)를 수집 할 수도 있습니다. SQL Server는 다른 키에 대한 선행 열 히스토그램 및 밀도 정보를 자동으로 구성합니다.

인덱스의 비 선행 열에 대한 히스토그램은 요청에 따라 쿼리 프로세서에 의해 자동으로 생성되거나 옵션 sp_createstats과 함께 사용 됩니다 @indexonly(다른 옵션 중에서도).

다중 열 히스토그램

단일 열 통계 (위와 같이)를 결합 할 때 만들어진 가정은 데이터의 현실을 충분히 모델링 할 수도 있고 그렇지 않을 수도 있습니다. 많은 경우에 사용 가능한 옵션 (지수 백 오프, 독립성, 최소 선택성)은 '충분한'추정치를 산출합니다.

또한 질문 예와 같이 카디널리티가 낮은 주요 열 인덱스에 대한 자연스러운 솔루션으로 통계 및 인덱스를 필터링했습니다. 이것을 논리적 인 극단으로 가져 가면 우리는 문제가 아닌 다차원 통계에 더 가까워집니다.

사용 가능한 모델링 옵션이 적절한 추정치를 제공 할 수없는 경우, 다중 컬럼 통계 히스토그램은 일부 경우에 적합한 인덱스 술어에 대해 더 나은 선택성 추정치를 제공 할 수 있습니다. 다른 열에 다른 데이터 유형을 결합하는 데 어려움이 있지만 극복 할 수있는 것은 없습니다.

또한 최상의 결과를 위해 각 수준의 인덱스 키에 대한 히스토그램이 필요합니다. 따라서 인덱스에 대한 (a, b, c)히스토그램 은 현재 단일 열 히스토그램 (a, b)과 함께 히스토그램을 의미 합니다.(a, b, c)(a)

오래된 통계를 감지하는 데 사용되는 메커니즘은 영향을받는 다중 열 히스토그램을 유지하기 위해 수정해야합니다. 이러한 히스토그램은 단일 열 통계보다 더 자주 재구성 될 수 있습니다. 이는 단순히 더 많은 열을 수정하면 영향을 미치기 때문입니다.

이 모든 것이 크기, 복잡성 및 유지 관리 오버 헤드를 추가합니다.

여러 열을 참조하는 신중하게 구성된 계산 열에서 생성 된 통계를 사용하여 여러 열 통계를 제한적으로 시뮬레이션 할 수 있습니다. 해당 통계를 이용하려면 쿼리에 계산 열에 조건자를 포함 (또는 기본 수식의 정확한 텍스트 일치)해야합니다. 이 방법이 실용적 일 수있는 상황은 매우 제한적일 수 있습니다. 그럼에도 불구하고 자동 다중 열 히스토그램과 동일한 구현 문제가 있습니다.

궁극적으로 SQL Server가 다중 열 통계를 지원하지 않는 이유를 확실하게 말할 수있는 유일한 사람은 디자이너 자체 일 것입니다. 이 분야에서 폭넓게 적용 할 수있는 제품 개선을위한 강력한 사례를 만들 수 있다고 생각되면 Connect 또는 일반 지원 채널을 통해 제안 할 수 있습니다.

각주

이 경우 첫 번째 열에는 두 개의 값만 있기 때문에 전체 히스토그램의 유용성이 떨어집니다.

통계가 구축되었을 때, 24,398 행이 있었다 : 히스토그램은 여전히 선두 열의 값의 분포에 대한 유용한 정보를 제공 IsArchived했다 거짓 되고는했다 216,602 행 사실을 .

또한 통계 개체는 평균 행 크기가 37 바이트 인 경우 (1 / 0.5) = 2 개의 고유 값 IsArchived, (1 / 4.149378E-06) ~ = 241000 개의 고유 값이 (IsArchived, Mystery)있으며와 동일한 빈도가 있음을 나타냅니다 (IsArchived, Mystery, Id). 행당 4 바이트 추가.

그것은 모두 좋은 범용 정보이며, 다른 열에 대한 통계 정보와 결합되어 여러 술어가있는 쿼리에서 선택성 추정치를 생성 할 수 있습니다 (언급 됨).

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