このトピックでは、プッシュダウンなしでフィルター条件を使用する方法と場所について説明します。
概要
デフォルトでは、AnalyticDB for MySQLはテーブルを作成するときにすべての列のインデックスを作成し、データフィルタリングの効率を向上させます。 ただし、一部のシナリオでは、データのフィルタリングに使用されるインデックスは、高いフィルタリング効率をもたらさないか、または全体的なパフォーマンスを低下させる可能性があります。 この場合、データのフィルタリングにインデックスを使用しないことを推奨します。 一部の列のインデックスは手動で削除できます。 ただし、これは、インデックスが必要なときに利用できない問題を引き起こす可能性があります。 AnalyticDB for MySQLは、プッシュダウンなしのフィルタ条件をサポートしており、クエリまたはクラスターレベルで一部の列のフィルタ条件のプッシュダウン機能を一時的にブロックします。 これにより、クエリ全体の効率が向上します。
次のシナリオでは、データのフィルタリングにインデックスを使用しないことを推奨します。
- 少数の一意の値。 これは、データフィルタリング後に大量のデータが返されることを意味します。 この場合、インデックスはデータフィルタリングに適していない可能性があります。
- ディスクI/O使用率が高い。 クエリの特性やデータの書き込みによって大量のI/Oリソースが占有されている場合、データのフィルタリングに使用されるインデックスは、ディスクI/Oリソースの競合を引き起こし、フィルタリングの効率を低下させる可能性があります。
- 複数の条件のプッシュダウン。 複数の条件がプッシュダウンされ、これらの条件にLIKEや文字列比較などの複雑な操作が含まれている場合、ストレージノード上の大量のリソースが消費されます。 これは全体のパフォーマンスに影響します。
フィルター条件が押し下げられているかどうかを確認する
実行ページでフィルター条件が押下されているかどうかを確認できます。
- 実装計画 タブで、TableScan演算子を含むステージをクリックします。 説明 実装計画 タブに移動する方法の詳細については、「診断結果の表示」をご参照ください。
- [ステージプランの表示] をクリックします。
- ステージ計画ページで、TableScan演算子をクリックします。
- 右側の [プロパティ] セクションで、PushedDownFilterプロパティが表示されているかどうかを確認します。 フィルター条件を押下すると、プロパティが表示されます。 それ以外の場合、プロパティは表示されません。 説明 また、実行プランを使用してフィルター条件をプッシュダウンするかどうかを確認できます。
- エラスティックモードのクラスターでは、フィルター演算子が下流のステージの実行計画に表示されているかどうかを確認できます。 フィルタ演算子が表示されている場合、その演算子に関連するフィルタ条件は押下されません。
- 予約モードのクラスターでは、現在のステージプランにフィルター演算子が表示されているかどうかを確認できます。 フィルタ演算子が表示されている場合、その演算子に関連するフィルタ条件は押下されません。
クエリの特定の列に対するフィルター条件のプッシュダウンを無効にする
特定のクエリでは、ヒントを使用して、特定の列のフィルター条件のプッシュダウンを無効にできます。 この操作は、ヒントを使用するクエリに対してのみ有効です。
構文
- マイナーエンジンバージョンが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以降では、データベース間で同じ名前のテーブルにヒントを使用できます。 バージョン3.1.4以降では、ヒントがSchema.table形式を使用してテーブルを区別できるためです。
- クラスターのマイナーエンジンバージョンを表示する方法の詳細については、AnalyticDB for MySQLクラスターのバージョンを照会するにはどうすればよいですか? クラスターのマイナーエンジンバージョンを更新するには、テクニカルサポートにお問い合わせください。
例
- 例 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以降では、データベース間で同じ名前のテーブルにヒントを使用できます。 バージョン3.1.4以降では、ヒントがSchema.table形式を使用してテーブルを区別できるためです。
- クラスターのマイナーエンジンバージョンを表示する方法の詳細については、AnalyticDB for MySQLクラスターのバージョンを照会するにはどうすればよいですか? クラスターのマイナーエンジンバージョンを更新するには、テクニカルサポートにお問い合わせください。
例
この例では、マイナーエンジンバージョンは3.1.4以降です。 現在のクラスターのすべてのクエリで、test02
データベースのtable02
テーブルのid
列を含むフィルター条件はプッシュダウンされません。
set adb_config filter_not_pushdown_columns=[test02.table02:id]