Interpretando planos de execução que contêm filtros de bitmap
Planos de execução de consulta paralela que usam filtro de bitmap têm um operador Bitmap em uma ou mais subárvores de operador. Um filtro de bitmap usa uma representação compacta de um conjunto de valores de uma tabela em uma parte da árvore de operador de uma segunda tabela em outra parte da árvore. Com a remoção de linhas desnecessárias cedo na consulta, os operadores subseqüentes têm menos linhas para trabalhar e o desempenho geral da consulta melhora.
No SQL Server 2008, a filtragem de bitmap pode ser introduzida no plano de consulta paralela depois da otimização, como no SQL Server 2005, ou pode ser introduzida dinamicamente pelo otimizador de consulta durante a geração do plano de consulta. Quando o filtro é introduzido dinamicamente, ele é chamado de filtro de bitmap otimizado. Um plano de consulta pode conter filtros de bitmap e filtros de bitmap otimizados. O otimizador de consulta determina quando um filtro de bitmap ou um filtro de bitmap otimizado é seletivo o bastante para ser útil e a quais operadores o filtro será aplicado. Para obter mais informações, consulte Otimizando o desempenho de consulta de data warehouse por filtragem de bitmap.
Ao analisar um plano de execução que contém filtragem de bitmap , é importante entender como os dados fluem pelo plano e onde a filtragem é aplicada. O filtro de bitmap e o filtro de bitmap otimizado são criados no lado da entrada de criação (a tabela de dimensão) de uma junção de hash; contudo, a filtragem de fato é normalmente executada no operador Parallelism que está no lado de entrada de investigação (a tabela de fato) da junção de hash. Entretanto, quando filtro de bitmap for baseado em uma coluna de inteiro, o filtro poderá ser aplicado diretamente à tabela inicial ou à operação de verificação de índice em vez do operador Paralellism. Essa técnica é chamada otimização em linha.
Exibindo filtros de bitmap em planos de execução
Para exibir filtros de bitmap no plano de consulta, use as opções SET de SHOWPLAN_ALL, SHOWPLAN_TEXT ou SHOWPLAN_XML, ou clique em Incluir Plano de Execução Real no SQL Server Management Studio.
Se um plano de execução XML for produzido, os operadores de bitmap físicos e lógicos serão listados do seguinte modo:
<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">
O operador em que um filtro de bitmap é aplicado contém o nome do bitmap na propriedade Probe Column.
O operador em que o filtro de bitmap otimizado é aplicado contém um predicado de bitmap na forma de PROBE ([Opt_Bitmap1001], {[column_name]} [, 'IN ROW']). O predicado de bitmap faz o relato das seguintes informações:
O nome do bitmap que corresponde ao nome introduzido no operador Bitmap Create. O prefixo 'Opt_' indica que um filtro de bitmap otimizado é usado.
A coluna fez a investigação. Esse é o ponto do qual os dados filtrados passam pela árvore.
Se a investigação de bitmap é executada em linha. Quando a otimização em linha é usada, a investigação de bitmap é chamada com o parâmetro IN ROW. Caso contrário, esse parâmetro estará faltando.
Exemplo
O exemplo a seguir demonstra como a filtragem de bitmap otimizada é usada em um plano de execução. As duas tabelas de dimensão DimProduct e DimCustomer juntam-se à tabela de fatos FactInternetSales que usa uma junção de chave primária para chave estrangeira em uma única coluna de inteiro.
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;
A ilustração a seguir mostra que um filtro de bitmap otimizado é criado na subárvore de operador de ambas as tabelas de dimensão depois que a tabela de dimensão é investigada e a informação necessária para eliminar linhas não qualificadas da tabela de fatos é conhecida. O filtro é aplicado então à tabela de fatos no local mais próximo possível, o operador Table Scan. O aplicativo do filtro é mostrado na seção de Predicado das propriedades Table Scan. A informação mostrada no Predicado indica que ambos os filtros de bitmap otimizado Opt_Bitmap1008 e Opt_Bitmap1009 são usados para limitar as linhas retornadas da tabela de fatos. As colunas investigadas na tabela de fatos são listadas como [F].[CustomerKey] e [F].[ProductKey]. O parâmetro IN ROW é mostrado, indicando que a otimização em linha foi usada no processo. Se a otimização em linha não for possível, a filtragem de bitmap será aplicada ao operador Parallelism.
Com base na ilustração, pode-se concluir o seguinte:
Os filtros de bitmap otimizados são criados em duas subárvores.
Ambos os filtros são aplicados dinamicamente a um único operador (Table Scan).
O filtro de bitmap otimizado calculado para ser o mais seletivo é implementado primeiro.
As colunas em que as tabelas de dimensão estão associadas à tabela de fatos permitem o uso de otimização em linha. Ou seja, a junção é baseada em uma única coluna de inteiro.
O filtro é aplicado ao possível ponto mais recente na consulta, resultando em um número reduzido de linhas que fluem da operação Table Scan pelos operadores restantes na árvore.