Résolution des problèmes liés à la sélectivité du filtre Bitmap

Le filtrage Bitmap peut améliorer considérablement les performances des requêtes d'entrepôt de données qui utilisent des schémas en étoile, en supprimant des lignes non qualifiantes au début du plan de requête. Cela réduit le nombre de lignes transmises par l'intermédiaire de l'opérateur de jointure et de tous les opérateurs suivants, en améliorant ainsi les temps de réponse des requêtes. Dans SQL Server 2008, le filtrage Bitmap peut être introduit dans le plan de requête après l'optimisation 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é. Pour plus d'informations sur le filtrage Bitmap, consultez Optimisation des performances des requêtes d'entrepôt de données grâce au filtrage Bitmap.

Les problèmes de performance spécifiques au filtrage Bitmap se produisent uniquement lorsqu'un filtre Bitmap devient non sélectif. Un filtre Bitmap non sélectif crée une charge mémoire inutile lors du traitement d'une requête et peut provoquer le ralentissement de la requête au lieu d'améliorer ses performances.

Diagnostic et résolution des problèmes liés aux filtres Bitmap non sélectifs

Pour diagnostiquer et résoudre des problèmes de performance de requêtes liés à des filtres Bitmap non sélectifs, procédez comme suit :

  1. Identifiez les requêtes à l'origine du problème de performance.

    Utilisez le SQL Server Profiler pour identifier la ou les requêtes lentes. Pour plus d'informations, consultez Utilisation du Générateur de profils SQL Server. Vous pouvez également analyser les performances des requêtes en générant un plan d'exécution de requêtes, qui peut être un texte, un fichier XML ou une représentation graphique du plan d'exécution de requêtes que génère l'optimiseur de requête. Pour plus d'informations, consultez SET SHOWPLAN_TEXT (Transact-SQL), Showplans XML et Affichage de plans d'exécution graphique (SQL Server Management Studio).

  2. Vérifiez que les requêtes utilisent des filtres Bitmap.

    Vous pouvez capturer des plans de requête à l'aide de sys.dm_exec_query_plan (Transact-SQL) et sys.dm_exec_query_stats (Transact-SQL) pour vérifier si la requête utilise réellement des filtres Bitmap. Vous pouvez également rechercher des filtres Bitmap dans le plan d'exécution XML ou le plan d'exécution graphique des requêtes. Pour plus d'informations, consultez Interprétation des plans d'exécution contenant des filtres Bitmap.

  3. Vérifiez que le filtrage Bitmap est à l'origine du problème de performance.

    Le filtrage Bitmap est appliqué uniquement aux plans de requête parallèles qui utilisent des jointures de hachage ou de fusion. Le filtrage Bitmap optimisé est appliqué uniquement aux plans de requête parallèles qui utilisent des jointures de hachage. Pour vérifier qu'un filtre Bitmap affecte les performances des requêtes, désactivez manuellement le filtrage Bitmap en spécifiant l'indicateur de jointure LOOP dans l'instruction de requête. L'optimiseur est ainsi forcé de choisir le type de jointure spécifié plutôt qu'une jointure de hachage. Vous pouvez également désactiver le filtrage Bitmap optimisé en spécifiant l'indicateur de jointure MERGE dans l'instruction de requête. Pour plus d'informations sur l'utilisation de ces indicateurs, consultez Indicateurs de jointure (Transact-SQL) et Indicateurs de requête (Transact-SQL).

  4. Utilisez l'événement de trace Bitmap Warning pour suivre les requêtes dans lesquelles les filtres Bitmap sont désactivés.

    Par défaut, l'optimiseur de requête désactive automatiquement les filtres Bitmap non sélectifs. Si l'événement de trace se déclenche, essayez d'éliminer les raisons qui rendent le filtre Bitmap non sélectif. Les causes de la non-sélectivité des filtres Bitmap peuvent être les suivantes :

    • Des estimations de cardinalité inappropriées effectuées par l'optimiseur de requête.

      SQL Server évalue les cardinalités essentiellement à partir d'histogrammes générés lors de la création manuelle ou automatique d'index ou de statistiques. Des statistiques obsolètes et des index manquants peuvent provoquer des estimations de cardinalité incorrectes, avec pour conséquence des calculs de coût inexacts susceptibles de générer des plans de requête non optimaux. Créez des index ou des statistiques utiles sur les colonnes impliquées dans la requête. Pour plus d'informations, consultez Résolution des problèmes liés à la médiocrité des performances des requêtes : estimation de la cardinalité.

    • La sollicitation de la mémoire sur le système.

      Dans un système surchargé dont la mémoire est fortement sollicitée, les requêtes comportant des filtres Bitmap dans le plan de requête peuvent éliminer l'opérateur Bitmap si elles n'obtiennent pas la mémoire minimale nécessaire pour créer cette bitmap. Le Moniteur système peut être utilisé pour surveiller les performances des composants SQL Server et non-SQL Server pouvant être à l'origine de la sollicitation de la mémoire sur le système. Par exemple, vous pouvez utiliser l'objet Memory Manager pour surveiller l'utilisation globale de la mémoire du serveur. Pour plus d'informations, consultez Surveillance de l'utilisation des ressources (Moniteur système). Pour plus d'informations sur la résolution de problèmes liés à la sollicitation de la mémoire, consultez Troubleshooting Performance Problems in SQL Server 2005 (en anglais).

    • Un nombre insuffisant de threads pour exécuter la requête en parallèle.

      Les filtres Bitmap sont appliqués uniquement dans un plan de requête parallèle. Lorsque les threads disponibles sont insuffisants pour un certain degré de parallélisme, le Moteur de base de données diminue automatiquement le degré de parallélisme ou abandonne complètement le plan parallèle dans le contexte de charge de travail spécifié. Ensuite, il exécute le plan série (un thread). Pour plus d'informations, consultez Degré de parallélisme.