このトピックでは、プッシュダウンされないフィルター条件の使用方法と使用場面について説明します。
概要
デフォルトでは、AnalyticDB for MySQL はテーブル作成時にすべてのカラムにインデックスを作成し、データフィルタリングの効率を向上させます。しかし、インデックスの使用が常に最適とは限らず、場合によっては全体的なパフォーマンスを低下させることもあります。手動でインデックスを削除することも可能ですが、後でそのインデックスが必要になった場合に問題が発生する可能性があります。フィルター条件のプッシュダウンを無効にする AnalyticDB for MySQL の機能は、より良いソリューションを提供します。この機能により、クエリレベルまたはクラスターレベルで特定カラムのフィルター条件が一時的にプッシュダウンされるのを防ぎ、クエリ全体のパフォーマンスを向上させることができます。
以下のシナリオでは、フィルター条件のプッシュダウンを無効にすることを検討してください:
-
低カーディナリティのデータ。カラムに含まれる一意の値が少ない場合、フィルタリング後も大量のデータが返されるため、インデックスは効果的ではありません。
-
高いディスク I/O 負荷。クエリや大量のデータ書き込みによって I/O 使用率が高くなっている場合、データフィルタリングにインデックスを使用すると、ディスク I/O リソースの競合が発生し、その効果が低下する可能性があります。
-
複数の条件を同時にプッシュダウンする場合、特に LIKE や文字列比較などの複雑な操作を含む条件は、ストレージノードで大量のリソースを消費し、全体的なパフォーマンスに影響を与える可能性があります。
フィルター条件がプッシュダウンされているかの確認
実行ページでフィルター条件がプッシュダウンされているかどうかを確認できます。
-
実装計画 タブで、`TableScan` オペレーターを含むステージをクリックします。
説明実装計画 タブへの移動方法については、「診断結果の表示」をご参照ください。
-
ステージプランの表示 をクリックします。
-
ステージプランのページで、`TableScan` オペレーターをクリックします。
-
右側の プロパティ パネルで、PushedDownFilter プロパティを探します。このプロパティが存在する場合、フィルター条件がプッシュダウンされたことを示します。たとえば、PushedDownFilter プロパティの値が
id = BIGINT '277941'の場合、フィルター条件がストレージレイヤーにプッシュダウンされたことを示します。説明-
エラスティックモードのクラスターの場合、下流ステージの実行計画に `Filter` オペレーターが表示されると、関連するフィルター条件はプッシュダウンされていません。
-
予約モードのクラスターの場合、現在のステージプランに `Filter` オペレーターが表示されると、関連するフィルター条件はプッシュダウンされていません。
-
クエリ内の特定カラムに対するフィルター条件のプッシュダウン無効化
特定のクエリでは、ヒントワードを使用して特定カラムのフィルター条件のプッシュダウンを無効にできます。この操作は、ヒントワードを使用するクエリに対してのみ有効です。
構文
-
マイナーエンジンバージョン 3.1.4 以降では、次のヒントワードを使用します:
/*+ filter_not_pushdown_columns=[Schema1.table1:colName1|colName2;Schema2.table2:colName1|colName2] */ -
マイナーエンジンバージョン 3.1.4 より前では、次のヒントワードを使用します:
/*+ no_index_columns=[table1.colName1;colName2,table2.colName1] */
-
ヒントワードを使用して、同一データベース内または異なるデータベース間のテーブルにある特定カラムのフィルター条件のプッシュダウンを無効にできます。マイナーエンジンバージョン 3.1.4 より前の場合、異なるデータベース間のテーブルにヒントワードを使用する際は、テーブル名が一意であることを確認してください。そうでない場合、意図しないテーブルに影響が及ぶ可能性があります。マイナーエンジンバージョン 3.1.4 以降では、ヒントワードは `Schema.table` 形式を使用してテーブルを区別するため、異なるデータベースで同じ名前のテーブルにヒントワードを使用しても、意図しない影響を防ぐことができます。
-
クラスターのマイナーエンジンバージョンを確認する方法については、「クラスターのバージョン情報の表示」をご参照ください。マイナーエンジンバージョンをアップグレードするには、テクニカルサポートにお問い合わせください。
例
-
例 1:
この例は、マイナーエンジンバージョン 3.1.4 以降を対象としています。現在のクエリでは、
test01データベースのtable01テーブルにあるidカラムとproductカラムのフィルター条件はプッシュダウンされません。/*+ filter_not_pushdown_columns=[test01.table01:id|product] */ -
例 2:
この例は、マイナーエンジンバージョン 3.1.4 以降を対象としています。現在のクエリでは、
test01データベースのtable01テーブルにあるidカラムとproductカラム、およびtest02データベースのtable03テーブルにあるkeyカラムのフィルター条件はプッシュダウンされません。/*+ filter_not_pushdown_columns=[test01.table01:id|product;test02.table03:key] */ -
例 3:
この例は、マイナーエンジンバージョン 3.1.4 より前を対象としています。現在のクエリでは、
table02テーブルのidカラムとproductカラム、およびtable03テーブルのkeyカラムのフィルター条件はプッシュダウンされません。/*+ no_index_columns=[table02.id;product,table03.key] */
クラスター内の特定カラムに対するフィルター条件のプッシュダウン無効化
次の文を実行して、現在のクラスターのすべてのクエリにおいて、特定カラムのフィルター条件のプッシュダウンを無効にできます。
構文
-
この設定は、同一データベース内または異なるデータベース間のテーブルにある特定カラムに適用できます。マイナーエンジンバージョン 3.1.4 より前の場合、異なるデータベース間のテーブルにこの設定を適用する際は、テーブル名が一意であることを確認してください。そうでない場合、意図しないテーブルに影響が及ぶ可能性があります。マイナーエンジンバージョン 3.1.4 以降では、`Schema.table` 形式を使用してテーブルを区別するため、異なるデータベースで同じ名前のテーブルに設定を適用しても、意図しない影響を防ぐことができます。
-
クラスターのマイナーエンジンバージョンを確認する方法については、「クラスターのバージョン情報の表示」をご参照ください。マイナーエンジンバージョンをアップグレードするには、テクニカルサポートにお問い合わせください。
例
この例は、マイナーエンジンバージョン 3.1.4 以降を対象としています。現在のクラスターのすべてのクエリにおいて、test02 データベースの table02 テーブルにある id カラムのフィルター条件はプッシュダウンされません。
set adb_config filter_not_pushdown_columns=[test02.table02:id]