비트맵 필터를 포함하는 실행 계획 해석

비트맵 필터링을 사용하는 병렬 쿼리 실행 계획은 하나 이상의 연산자 하위 트리에 Bitmap 연산자를 포함합니다. 비트맵 필터는 연산자 트리의 한 부분에 있는 테이블의 값 집합에 대한 압축된 표현을 사용하여 트리의 다른 부분에 있는 다른 테이블에서 행을 필터링합니다. 쿼리 초기 단계에서 필요 없는 행을 제거하면 이후 연산자에서 작업할 행 수가 더 적어지고 쿼리의 전체적인 성능이 향상됩니다.

SQL Server 2008의 비트맵 필터링은 SQL Server 2005에서와 마찬가지로 병렬 쿼리 계획에서 최적화 후 적용되거나, 쿼리 계획 생성 중에 쿼리 최적화 프로그램에 의해 동적으로 적용될 수 있습니다. 필터가 동적으로 사용되는 경우 이를 최적화된 비트맵 필터라고 합니다. 쿼리 계획에는 비트맵 필터와 최적화된 비트맵 필터 두 가지 모두 포함될 수 있습니다. 쿼리 최적화 프로그램은 비트맵 필터 또는 최적화된 비트맵 필터가 유용할 만큼 충분히 선택 가능성이 높아지는 시점과 필터를 적용할 연산자를 판단합니다. 자세한 내용은 비트맵 필터링을 통한 데이터 웨어하우스 쿼리 성능 최적화를 참조하십시오.

비트맵 필터링이 포함된 실행 계획을 분석하는 경우 계획 내 데이터의 흐름과 필터링이 적용되는 지점을 파악하는 것이 중요합니다. 비트맵 필터 및 최적화된 필터는 해시 조인의 빌드 입력(차원 테이블) 쪽에서 생성되지만 실제 필터링은 해시 조인의 검색 입력(팩트 테이블) 쪽 Parallelism 연산자 내에서 수행됩니다. 비트맵 필터의 기준 열이 정수일 경우 필터는 Parallelism 연산자가 아닌 초기 테이블 또는 인덱스 검색 작업에 곧바로 적용될 수 있습니다. 이 기술을 행 내 최적화라고 합니다.

실행 계획의 비트맵 필터 보기

쿼리 계획의 비트맵 필터를 보려면 SET 옵션 SHOWPLAN_ALL, SHOWPLAN_TEXT 또는 SHOWPLAN_XML을 사용하거나 SQL Server Management Studio에서 실제 실행 계획 포함을 클릭합니다.

XML 실행 계획이 생성되면 물리적 및 논리적 비트맵 연산자는 다음과 같은 방식으로 나열됩니다.

<RelOp NodeId="2" PhysicalOp="Bitmap" LogicalOp="Bitmap Create" EstimateRows="88" EstimateIO="0" EstimateCPU="0.0718125" AvgRowSize="6893" EstimatedTotalSubtreeCost="0.229385" Parallel="1" EstimateRebinds="0" EstimateRewinds="0">

비트맵 필터가 적용된 연산자에는 Probe Column 속성에 비트맵의 이름이 포함됩니다.

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

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

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

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

다음 예에서는 실행 계획에서 최적화된 비트맵 필터링을 사용하는 방법을 보여 줍니다. DimProduct 및 DimCustomer라는 두 차원 테이블이 단일 정수 열을 기준으로 기본 키-외래 키 조인을 사용하여 FactInternetSales라는 팩트 테이블에 조인합니다.

USE AdventureWorksDW;
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;

다음 그림에서는 차원 테이블을 검색하여 팩트 테이블에서 조건에 맞지 않는 행을 제거하는 데 필요한 정보를 파악한 후 두 차원 테이블의 연산자 하위 트리에서 최적화된 비트맵 필터가 생성되는 것을 보여 줍니다. 이후 이 필터는 가능한 가장 빠른 위치인 Table Scan 연산자에서 팩트 테이블에 적용됩니다. 필터 적용은 Table Scan 속성의 Predicate 섹션에서 볼 수 있습니다. Predicate의 정보는 팩트 테이블에서 반환되는 행을 제한하기 위해 두 가지 최적화된 비트맵 필터 Opt_Bitmap1008과 Opt_Bitmap1009가 모두 사용됨을 나타냅니다. 팩트 테이블의 검색 대상 열은 [F].[CustomerKey] 및 [F].[ProductKey]로 나열됩니다. IN ROW 매개 변수가 표시되는데, 이는 프로세스에서 행 내 최적화가 사용되었음을 나타냅니다. 행 내 최적화가 불가능한 경우 비트맵 필터링은 Parallelism 연산자에 적용됩니다.

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

그림을 바탕으로 다음과 같은 결론을 내릴 수 있습니다.

  • 최적화된 비트맵 필터는 두 개의 하위 트리에서 생성됩니다.

  • 두 필터는 단일(Table Scan) 연산자에 동적으로 적용됩니다.

  • 가장 선택도가 높은 예상되는 최적화된 비트맵 필터가 먼저 구현됩니다.

  • 차원 테이블이 팩트 테이블에 조인된 열은 행 내 최적화 사용이 가능합니다. 즉, 이 조인은 단일 정수 열을 기반으로 합니다.

  • 필터는 쿼리에서 가능한 가장 빠른 지점에 적용되어 Table Scan 작업에서 트리의 나머지 연산자까지 이동하는 행의 수를 줄여 줍니다.