Interprétation des plans d'exécution contenant des filtres Bitmap

Les plans d'exécution de requêtes parallèles qui utilisent le filtrage Bitmap possèdent un opérateur Bitmap dans une ou plusieurs sous-arborescences d'opérateur. Un filtre Bitmap utilise une représentation compacte d'un ensemble de valeurs d'une table dans une partie de l'arborescence de l'opérateur pour filtrer les lignes d'une seconde table dans une autre partie de l'arborescence. Avec la suppression des lignes inutiles tôt dans la requête, les opérateurs suivants ont moins de lignes à traiter et les performances globales de la requête sont améliorées.

Dans SQL Server 2008, le filtrage Bitmap peut être introduit dans le plan de requête parallèle après l'optimisation, comme dans SQL Server 2005, ou introduit dynamiquement par l'optimiseur de requête pendant la génération du plan de requête. Lorsque le filtre est introduit dynamiquement, il est appelé filtre Bitmap optimisé. Un plan de requête peut contenir des filtres Bitmap ainsi que des filtres Bitmap optimisés. L'optimiseur de requête détermine quand un filtre Bitmap ou un filtre Bitmap optimisé est suffisamment sélectif pour être utile et dans quels opérateurs le filtre est appliqué. Pour plus d'informations, consultez Optimisation des performances des requêtes d'entrepôt de données grâce au filtrage Bitmap.

Lors de l'analyse d'un plan d'exécution contenant un filtrage Bitmap, il est important de comprendre comment les données circulent dans le plan et où le filtrage est appliqué. Le filtre Bitmap et le filtre Bitmap optimisé sont créés côté entrée de génération (table de dimension) d'une jointure de hachage ; toutefois, le filtrage lui-même est effectué en général dans l'opérateur Parallelism, qui se trouve côté entrée de test (table de faits) de la jointure de hachage. Toutefois, lorsque le filtre Bitmap est basé sur une colonne d'entiers, le filtre peut être appliqué directement à l'opération initiale d'analyse de table ou d'index plutôt qu'à l'opérateur Parallelism. Cette technique est appelée optimisation par ligne.

Affichage des filtres Bitmap dans les plans d'exécution de requêtes

Pour afficher les filtres Bitmap dans le plan de requête, utilisez les options SET SHOWPLAN_ALL, SHOWPLAN_TEXT ou SHOWPLAN_XML, ou cliquez sur Inclure le plan d'exécution réel dans SQL Server Management Studio.

Si un plan d'exécution XML est produit, les opérateurs Bitmap physiques et logiques sont répertoriés de la manière suivante :

<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">

L'opérateur dans lequel un filtre Bitmap est appliqué contient le nom de la bitmap dans la propriété Probe Column.

L'opérateur dans lequel s'applique le filtre Bitmap optimisé contient un prédicat de bitmap de la forme PROBE([Opt_Bitmap1001], {[nom_colonne]} [, 'IN ROW']). Le prédicat de bitmap signale les informations suivantes :

  • Le nom de bitmap qui correspond au nom introduit dans l'opérateur Bitmap Create. Le préfixe 'Opt_' indique qu'un filtre Bitmap optimisé est utilisé.

  • La colonne par rapport à laquelle le test est effectué. Il s'agit du point à partir duquel les données filtrées circulent dans l'arborescence.

  • Si le test de bitmap est effectué dans la ligne. Lorsque l'optimisation par ligne est utilisée, le test de bitmap est appelé avec le paramètre IN ROW. Dans le cas contraire, ce paramètre manque.

Exemple

L'exemple suivant montre comment le filtrage Bitmap optimisé est utilisé dans un plan d'exécution. Les deux tables de dimension DimProduct et DimCustomer sont jointes à la table de faits FactInternetSales à l'aide d'une jointure clé primaire à clé étrangère sur une colonne d'entiers unique.

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;

L'illustration suivante montre qu'un filtre Bitmap optimisé est créé dans la sous-arborescence de l'opérateur des deux tables de dimension après que la table de dimension a été analysée et que les informations nécessaires pour éliminer les lignes non éligibles de la table de faits sont connues. Le filtre est alors appliqué à la table de faits dans le premier emplacement possible, l'opérateur Table Scan. L'application du filtre est illustrée dans la section Predicate des propriétés Table Scan. Les informations qui figurent dans la section Predicate indiquent que les deux filtres Bitmap optimisés Opt_Bitmap1008 et Opt_Bitmap1009 sont utilisés pour limiter les lignes retournées à partir de la table de faits. Les colonnes par rapport auxquelles s'effectue le test dans la table de faits sont répertoriées sous la forme [F]. [CustomerKey] et [F]. [ProductKey]. Le paramètre IN ROW est affiché, ce qui indique que l'optimisation par ligne est utilisée dans le processus. Si l'optimisation par ligne n'est pas possible, le filtrage Bitmap est appliqué à l'opérateur Parallelism.

Plan de requête SQL Server avec filtres de bitmaps.

Les conclusions suivantes peuvent être tirées de l'illustration :

  • Les filtres Bitmap optimisés sont créés dans deux sous-arborescences.

  • Les deux filtres sont appliqués dynamiquement à un opérateur unique (Table Scan).

  • Le filtre Bitmap optimisé estimé comme le plus sélectif est implémenté en premier.

  • Les colonnes sur lesquelles les tables de dimension sont jointes à la table de faits permettent d'utiliser l'optimisation par ligne. En d'autres termes, la jointure est basée sur une colonne d'entiers unique.

  • Le filtre est appliqué au premier point possible dans la requête, ce qui réduit le nombre de lignes circulant de l'opération Table Scan via les autres opérateurs dans l'arborescence.