비트맵 필터링을 통한 데이터 웨어하우스 쿼리 성능 최적화

대부분의 데이터 웨어하우스 쿼리는 별모양 스키마를 따르며 단일 쿼리로 수억 개의 행을 처리할 수 있습니다. 기본적으로 쿼리 최적화 프로그램은 별모양 스키마를 대상으로 쿼리를 검색하며 이를 위한 효율적인 쿼리 계획을 작성합니다. 최적화 프로그램이 효율적인 계획을 생성하는 데 사용할 수 있는 한 가지 방법은 비트맵 필터링을 사용하는 것입니다. 비트맵 필터는 연산자 트리의 한 부분에 있는 테이블의 값 집합에 대한 압축된 표현을 사용하여 트리의 다른 부분에 있는 다른 테이블에서 행을 필터링합니다. 기본적으로 이 필터는 세미 조인을 사용하여 대상을 구체화하므로 두 번째 테이블에서 첫 번째 테이블로의 조인 조건을 충족하는 행만 처리됩니다.

SQL Server 2008에서 비트맵 필터링은 SQL Server 2005에서와 마찬가지로 쿼리 계획에서 최적화 후 적용되거나 쿼리 계획 생성 중에 쿼리 최적화 프로그램에 의해 동적으로 적용될 수 있습니다. 필터가 동적으로 사용되는 경우 이를 최적화된 비트맵 필터라고 합니다. 최적화된 비트맵 필터링은 쿼리 계획 초기에 팩트 테이블에서 조건에 맞지 않는 행을 제거함으로써 별모양 스키마를 사용하는 데이터 웨어하우스 쿼리의 성능을 크게 향상시킵니다. 최적화된 비트맵 필터링을 사용하지 않으면 차원 테이블을 사용한 조인 연산에서 조건에 맞지 않는 행을 제거하기 전에 연산자 트리의 일부를 통해 팩트 테이블의 모든 행이 처리됩니다. 그러나 최적화된 비트맵 필터링을 적용하면 조건에 맞지 않는 행이 팩트 테이블에서 즉시 제거됩니다.

최적화된 비트맵 필터링은 SQL Server Enterprise, Developer 및 Evaluation Edition에서만 사용할 수 있습니다.

비트맵 필터링 이해

비트맵 필터는 비트맵 인덱스와 비교해 보면 쉽게 이해할 수 있습니다. 비트맵 인덱스는 테이블의 어떤 행이 특정 열 값을 포함하는지 나타내는 하나 이상의 비트 벡터를 사용하여 값-목록 인덱스로 RID(행 ID) 목록을 표현하는 또 다른 형식입니다. 양쪽 모두 결과 처리에서 불필요한 행을 제거하는 데는 매우 효율적이지만 비트맵 필터와 비트맵 인덱스 사이에는 중요한 차이점이 있습니다. 먼저, 비트맵 필터는 메모리 내 구조체이므로 기본 테이블에 대해 수행되는 DML(데이터 조작 언어) 작업으로 인한 인덱스 유지 관리 오버헤드가 발생하지 않습니다. 또한 비트맵 필터는 아주 작으며 디스크에 저장되는 인덱스의 경우 생성된 기반 테이블의 크기에 따라 좌우되는 것과는 달리 쿼리 처리 시간에 미치는 영향을 최소화하면서 동적으로 생성될 수 있습니다.

비트맵 필터링과 최적화된 비트맵 필터링 비교

비트맵 필터링 및 최적화된 비트맵 필터링은 bitmap 실행 계획 연산자를 사용하여 쿼리 계획 내에 구현됩니다. 비트맵 필터링은 해시 또는 병합 조인이 사용되는 병렬 쿼리 계획에만 적용되며 최적화된 비트맵 필터링은 해시 조인이 사용되는 병렬 쿼리 계획에만 적용할 수 있습니다. 두 경우 모두 해시 조인의 빌드 입력(차원 테이블) 쪽에서 비트맵 필터가 생성되지만 실제 필터링은 해시 조인의 검색 입력(팩트 테이블) 쪽 Parallelism 연산자 내에서 수행됩니다. 조인의 기준 열이 정수일 경우 필터는 Parallelism 연산자가 아닌 초기 테이블 또는 인덱스 검색 작업에 곧바로 적용될 수 있습니다. 이 기술을 행 내 최적화라고 합니다.

비트맵 필터링이 최적화 후 쿼리 계획에 적용되면 쿼리 컴파일 시간은 줄어들지만 최적화 프로그램이 선택할 수 있는 쿼리 계획이 제한되므로 카디널리티 및 비용 예측이 고려되지 않습니다.

최적화된 비트맵 필터는 다음과 같은 장점이 있습니다.

  • 여러 차원 테이블로부터의 필터링이 지원됩니다.

  • 한 연산자에 여러 필터를 적용할 수 있습니다.

  • 최적화된 비트맵 필터는 더 다양한 종류의 연산자에 적용될 수 있습니다. 이러한 연산자로는 Distribute StreamsRepartition Streams 연산자, table scan 또는 index scan 연산자, filter 연산자 등이 있습니다.

  • 필터링을 SELECT 문에 적용할 수 있으며 INSERT, UPDATE, DELETE 및 MERGE 문에 사용되는 읽기 전용 연산자에도 적용할 수 있습니다.

  • 인덱스를 채우는 데 사용되는 연산자에서 인덱스를 생성하는 데 필터링을 적용할 수 있습니다.

  • 최적화된 비트맵 필터링이 적절한지 판단하기 위해 최적화 프로그램이 카디널리티 및 비용 예측을 사용합니다.

  • 최적화 프로그램이 고려할 수 있는 계획의 수가 늘어납니다.

최적화된 비트맵 필터링이 구현되는 방법

비트맵 필터는 선택적인 경우에만 유용합니다. 쿼리 최적화 프로그램은 최적화된 비트맵 필터가 유용할 만큼 충분히 선택 가능성이 높아지는 시점과 필터를 적용할 연산자를 판단하고 스타 조인의 모든 분기에 최적화된 비트맵 필터를 배치한 다음 비용 규칙을 사용하여 계획에 가장 작은 실행 비용이 예측되는지 판단합니다. 최적화된 비트맵 필터가 비선택적인 경우 대개 예측되는 비용이 너무 크므로 해당 계획은 무시됩니다. 계획의 어느 부분에 최적화된 비트맵 필터를 배치할지 결정할 때 최적화 프로그램은 해시 조인의 오른쪽 하위 스택과 같은 해시 조인 변형을 찾습니다. 차원 테이블이 있는 조인은 가장 많이 선택되는 조인을 실행하도록 구현됩니다.

최적화된 비트맵 필터가 적용되는 연산자에는 PROBE([Opt_Bitmap1001], {[column_name]} [, 'IN ROW']) 형식의 비트맵 조건자가 포함됩니다. 비트맵 조건자는 다음 정보를 보고합니다.

  • Bitmap 연산자에 사용되는 이름에 해당하는 비트맵 이름. 접두사인 'Opt_'는 최적화된 비트맵 필터가 사용됨을 나타냅니다.

  • 검색할 대상 열. 트리를 거치는 데이터의 흐름이 시작되는 지점입니다.

  • 비트맵 검색에 행 내 최적화를 사용하는지 여부. 행 내 최적화를 사용할 경우 IN ROW 매개 변수를 통해 비트맵 검색이 호출되며 그렇지 않을 경우 이 매개 변수는 생략됩니다.

다음 예는 간단한 별모양 스키마를 대상으로 한 쿼리를 보여 줍니다. DimProduct 및 DimCustomer라는 두 차원 테이블이 단일 정수 열을 기준으로 기본 키-외래 키 조인을 사용하여 FactInternetSales라는 팩트 테이블에 조인합니다.

USE AdventureWorksDW2008R2;
GO
SELECT * 
FROM dbo.FactInternetSales AS F
INNER JOIN dbo.DimProduct AS D1 ON F.ProductKey = D1.ProductKey
INNER JOIN dbo.DimCustomer AS D2 ON F.CustomerKey = D2.CustomerKey
WHERE D1.StandardCost <= 30 AND D2.YearlyIncome <= 50000;

다음 그림은 SQL Server 2005에서 나타나는 이 실행 계획을 보여 줍니다. 1A로 표시된 지점에서 차원 테이블이 검색되고 팩트 테이블(1B)에서 조건에 맞지 않는 행을 필터링하여 제거하는 데 필요한 정보가 파악됩니다. 그러나 Table Scan 연산자의 속성을 보면 팩트 테이블에서 반환되는 행을 제한하는 데 사용되는 조건자가 없음을 알 수 있습니다.

비트맵 필터를 사용하지 않는 SQL Server 쿼리 계획

이와는 다르게 다음 그림은 SQL Server 2008에서 나타나는 같은 쿼리의 실행 계획을 보여 줍니다. 최적화된 비트맵 연산자가 양쪽 차원 테이블의 하위 트리에 사용되었으며 table scan 연산자의 속성을 보면 이러한 하위 트리의 필터(비트맵 검색)가 팩트 테이블 트리에 직접 적용되어 첫 번째 조인 이전에 팩트 테이블에서 반환되는 행을 제한함을 알 수 있습니다.

비트맵 필터를 사용하는 SQL Server 쿼리 계획

최적화된 비트맵 필터 요구 사항

최적화된 비트맵 필터링에는 다음과 같은 요구 사항이 있습니다.

  • 팩트 테이블에는 최소한 100페이지가 있어야 합니다. 최적화 프로그램은 이보다 더 작은 테이블을 차원 테이블로 간주합니다.

  • 팩트 테이블과 차원 테이블 간의 내부 조인만 고려됩니다.

  • 팩트 테이블과 차원 테이블 간의 조인 조건자는 단일 열 조인이어야 하지만 기본 키-외래 키 관계일 필요는 없습니다. 정수 기반의 열이 선호됩니다.

  • 차원을 사용한 조인은 차원 입력 카디널리티가 팩트 테이블의 입력 카디널리티보다 작을 때만 고려됩니다.