Cette rubrique explique comment et où utiliser les conditions de filtre sans pushdown.
Vue d'ensemble
Par défaut, AnalyticDB for MySQL crée un index pour chaque colonne lors de la création d'une table afin d'améliorer l'efficacité du filtrage des données. Toutefois, l'utilisation d'un index n'est pas toujours optimale et peut parfois dégrader les performances globales. Bien que vous puissiez supprimer manuellement les index, cela risque de poser problème si un index s'avère nécessaire par la suite. La fonctionnalité de désactivation du pushdown des conditions de filtre dans AnalyticDB for MySQL offre une meilleure solution. Elle permet d'empêcher temporairement le pushdown des conditions de filtre sur des colonnes spécifiques au niveau de la requête ou du cluster, ce qui améliore les performances globales des requêtes.
Envisagez de désactiver le pushdown des conditions de filtre dans les scénarios suivants :
Données à faible cardinalité. Lorsqu'une colonne comporte peu de valeurs uniques, le filtrage renvoie toujours une grande quantité de données, rendant l'index inefficace.
Pression élevée sur les E/S disque. Si vos requêtes ou des écritures massives de données entraînent une utilisation importante des E/S, l'utilisation d'un index pour le filtrage des données peut créer une contention sur les ressources d'E/S disque et réduire son efficacité.
Le pushdown simultané de plusieurs conditions, en particulier celles impliquant des opérations complexes telles que LIKE ou des comparaisons de chaînes, peut consommer des ressources importantes sur les nœuds de stockage et affecter les performances globales.
Vérifier si les conditions de filtre sont poussées vers le bas (pushdown)
Vérifiez si les conditions de filtre sont poussées vers le bas sur la page d'exécution.
-
Dans l'onglet Execution Plan, cliquez sur l'étape contenant l'opérateur TableScan.
RemarquePour savoir comment accéder à l'onglet Execution Plan, consultez la section Afficher les résultats de diagnostic.
Cliquez sur View Stage Plans.
Sur la page du plan d'étape, cliquez sur l'opérateur TableScan.
-
Dans le panneau Properties situé à droite, recherchez la propriété PushedDownFilter. Sa présence indique que la condition de filtre a été poussée vers le bas. Par exemple, si la valeur de la propriété PushedDownFilter est
id = BIGINT '277941', cela signifie que la condition de filtre a été poussée vers la couche de stockage.RemarquePour un cluster en mode élastique, si un opérateur Filter apparaît dans le plan d'exécution d'une étape en aval, ses conditions de filtre associées n'ont pas été poussées vers le bas.
Pour un cluster en mode réservé, si un opérateur Filter apparaît dans le plan de l'étape actuelle, ses conditions de filtre associées n'ont pas été poussées vers le bas.
Désactiver le pushdown des conditions de filtre pour des colonnes spécifiques dans une requête
Dans une requête spécifique, utilisez un indice (hint) pour désactiver le pushdown des conditions de filtre pour des colonnes spécifiques. Cette opération ne s'applique qu'aux requêtes utilisant des indices.
Syntaxe
-
Pour la version mineure du moteur 3.1.4 ou ultérieure, utilisez l'indice suivant :
/*+ filter_not_pushdown_columns=[Schema1.table1:colName1|colName2;Schema2.table2:colName1|colName2] */ -
Pour une version mineure du moteur antérieure à 3.1.4, utilisez l'indice suivant :
/*+ no_index_columns=[table1.colName1;colName2,table2.colName1] */
Vous pouvez utiliser un indice pour désactiver le pushdown des conditions de filtre pour des colonnes spécifiques dans des tables situées dans la même base de données ou dans des bases de données différentes. Pour une version mineure du moteur antérieure à 3.1.4, lorsque vous utilisez un indice pour des tables situées dans des bases de données différentes, assurez-vous que les noms de table sont uniques. Sinon, l'indice pourrait affecter des tables non concernées. Dans la version mineure du moteur 3.1.4 et ultérieures, les indices utilisent le format
Schema.tablepour différencier les tables, ce qui évite les effets indésirables lors de l'utilisation d'indices sur des tables portant le même nom dans différentes bases de données.Pour afficher la version mineure du moteur de votre cluster, consultez la section Afficher les informations de version du cluster. Pour mettre à niveau la version mineure du moteur, contactez le support technique.
Exemples
-
Exemple 1 :
Cet exemple concerne une version mineure du moteur 3.1.4 ou ultérieure. Dans la requête actuelle, les conditions de filtre sur les colonnes
idetproductde la tabletable01dans la base de donnéestest01ne sont pas poussées vers le bas./*+ filter_not_pushdown_columns=[test01.table01:id|product] */ -
Exemple 2 :
Cet exemple concerne une version mineure du moteur 3.1.4 ou ultérieure. Dans la requête actuelle, les conditions de filtre sur les colonnes
idetproductde la tabletable01dans la base de donnéestest01, ainsi que sur la colonnekeyde la tabletable03dans la base de donnéestest02ne sont pas poussées vers le bas./*+ filter_not_pushdown_columns=[test01.table01:id|product;test02.table03:key] */ -
Exemple 3 :
Cet exemple concerne une version mineure du moteur antérieure à 3.1.4. Dans la requête actuelle, les conditions de filtre sur les colonnes
idetproductde la tabletable02, ainsi que sur la colonnekeyde la tabletable03ne sont pas poussées vers le bas./*+ no_index_columns=[table02.id;product,table03.key] */
Désactiver le pushdown des conditions de filtre pour des colonnes spécifiques dans un cluster
Exécutez les instructions suivantes pour désactiver le pushdown des conditions de filtre pour des colonnes spécifiques dans toutes les requêtes du cluster actuel.
Syntaxe
Vous pouvez utiliser un indice pour désactiver le pushdown des conditions de filtre pour des colonnes spécifiques dans des tables situées dans la même base de données ou dans des bases de données différentes. Pour une version mineure du moteur antérieure à 3.1.4, lorsque vous utilisez un indice pour des tables situées dans des bases de données différentes, assurez-vous que les noms de table sont uniques. Sinon, l'indice pourrait affecter des tables non concernées. Dans la version mineure du moteur 3.1.4 et ultérieures, les indices utilisent le format
Schema.tablepour différencier les tables, ce qui évite les effets indésirables lors de l'utilisation d'indices sur des tables portant le même nom dans différentes bases de données.Pour afficher la version mineure du moteur de votre cluster, consultez la section Afficher les informations de version du cluster. Pour mettre à niveau la version mineure du moteur, contactez le support technique.
Exemples
Cet exemple concerne une version mineure du moteur 3.1.4 ou ultérieure. Pour toutes les requêtes du cluster actuel, les conditions de filtre sur la colonne id de la table table02 dans la base de données test02 ne sont pas poussées vers le bas.
set adb_config filter_not_pushdown_columns=[test02.table02:id]