最適化ルールと式のプッシュダウンのブロックリスト
このドキュメントでは、最適化ルールのブロックリストと式プッシュダウンのブロックリストを使用して、TiDBの動作を制御する方法を紹介します。
最適化ルールのブロックリスト
最適化ルールのブロックリストは、最適化ルールを調整する1つの方法であり、主に一部の最適化ルールを手動で無効にするために使用されます。
重要な最適化ルール
| 最適化ルール | ルール名 | 説明 |
|---|---|---|
| 列の剪定 | column_prune | 上位のエグゼキュータが必要としない場合は、1人のオペレータが列を整理します。 |
| サブクエリを非相関化 | デコレレート | 相関サブクエリを非相関結合または集約に書き直そうとします。 |
| 集計の除去 | Aggregation_eliminate | 実行プランから不要な集計演算子を削除しようとします。 |
| 突起物の除去 | Projection_eliminate | 実行プランから不要な射影演算子を削除します。 |
| 最大/最小除去 | max_min_eliminate | 一部のmax/min関数を集約してorder by + limit 1形式に書き換えます。 |
| 述語プッシュダウン | predicate_push_down | データソースに近い演算子に述語をプッシュしようとします。 |
| アウタージョインの排除 | external_join_eliminate | 実行プランから不要な左結合または右結合を削除しようとします。 |
| パーティションの剪定 | partition_processor | 述部によって拒否されたパーティションを削除し、パーティションテーブルクエリをUnionAll + Partition Datasource形式に書き換えます。 |
| 集計プッシュダウン | Aggregation_push_down | アグリゲーションを子にプッシュしようとします。 |
| TopNプッシュダウン | topn_push_down | TopNオペレーターをデータソースに近い場所にプッシュしようとします。 |
| 再注文に参加 | join_reorder | マルチテーブル結合の順序を決定します。 |
最適化ルールを無効にする
一部のルールが特別なクエリの最適ではない実行プランにつながる場合は、最適化ルールのブロックリストを使用して、それらの一部を無効にすることができます。
使用法
ノート:
以下のすべての操作には、データベースの
super privilegeの特権が必要です。各最適化ルールには名前があります。たとえば、列プルーニングの名前はcolumn_pruneです。すべての最適化ルールの名前は、表重要な最適化ルールの2番目の列にあります。
一部のルールを無効にする場合は、その名前を
mysql.opt_rule_blacklistテーブルに書き込みます。例えば:INSERT INTO mysql.opt_rule_blacklist VALUES("join_reorder"), ("topn_push_down");次のSQLステートメントを実行すると、上記の操作をすぐに有効にすることができます。有効範囲には、対応するTiDBサーバーのすべての古い接続が含まれます。
admin reload opt_rule_blacklist;ノート:
admin reload opt_rule_blacklistは、上記のステートメントが実行されたTiDBサーバーでのみ有効です。クラスタのすべてのTiDBサーバーを有効にする場合は、各TiDBサーバーでこのコマンドを実行します。ルールを再度有効にする場合は、テーブル内の対応するデータを削除してから、次の
admin reloadのステートメントを実行します。DELETE FROM mysql.opt_rule_blacklist WHERE name IN ("join_reorder", "topn_push_down");admin reload opt_rule_blacklist;
式プッシュダウンのブロックリスト
式のプッシュダウンのブロックリストは、式のプッシュダウンを調整する1つの方法であり、主に特定のデータ型の一部の式を手動で無効にするために使用されます。
プッシュダウンがサポートされている式
特定の式のプッシュダウンを無効にする
式のプッシュダウンが原因で間違った結果が得られた場合は、ブロックリストを使用してアプリケーションをすばやく回復できます。具体的には、サポートされている関数または演算子の一部をmysql.expr_pushdown_blacklistテーブルに追加して、特定の式のプッシュダウンを無効にすることができます。
mysql.expr_pushdown_blacklistのスキーマは次のように表示されます。
DESC mysql.expr_pushdown_blacklist;
+------------+--------------+------+------+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+------+-------------------+-------+
| name | char(100) | NO | | NULL | |
| store_type | char(100) | NO | | tikv,tiflash,tidb | |
| reason | varchar(200) | YES | | NULL | |
+------------+--------------+------+------+-------------------+-------+
3 rows in set (0.00 sec)
上記の各フィールドの説明は次のとおりです。
name:プッシュダウンが無効になっている関数の名前。store_type:計算のために関数がプッシュダウンされないようにするコンポーネントを指定します。使用可能なコンポーネントはtidb、およびtikvtiflash。store_typeでは大文字と小文字は区別されません。複数のコンポーネントを指定する必要がある場合は、コンマを使用して各コンポーネントを区切ります。store_typeがtidbの場合、TiDBメモリテーブルの読み込み中に他のTiDBサーバーで機能を実行できるかどうかを示します。store_typeがtikvの場合、TiKVサーバーのコプロセッサーコンポーネントで機能を実行できるかどうかを示します。store_typeがtiflashの場合、TiFlashサーバーのコプロセッサーコンポーネントで機能を実行できるかどうかを示します。
reason:この関数がブロックリストに追加された理由を記録します。
使用法
このセクションでは、式プッシュダウンのブロックリストの使用方法について説明します。
ブロックリストに追加
1つ以上の式(関数または演算子)をブロックリストに追加するには、次の手順を実行します。
対応する関数名または演算子名、およびプッシュダウンを無効にするコンポーネントのセットを
mysql.expr_pushdown_blacklistのテーブルに挿入します。admin reload expr_pushdown_blacklistを実行します。
ブロックリストから削除する
ブロックリストから1つ以上の式を削除するには、次の手順を実行します。
対応する関数名または演算子名、およびプッシュダウンを無効にするコンポーネントのセットを
mysql.expr_pushdown_blacklistのテーブルから削除します。admin reload expr_pushdown_blacklistを実行します。
ノート:
admin reload expr_pushdown_blacklistは、このステートメントが実行されるTiDBサーバーでのみ有効です。クラスタのすべてのTiDBサーバーを有効にする場合は、各TiDBサーバーでこのコマンドを実行します。
式ブロックリストの使用例
次の例では、 <と>の演算子がブロックリストに追加され、次に>の演算子がブロックリストから削除されます。
ブロックリストが有効かどうかを判断するには、 EXPLAINの結果を観察します( TiDBクエリ実行プランの概要を参照)。
次のSQLステートメントの
WHERE節の述語a < 2とa > 2は、TiKVにプッシュダウンできます。EXPLAIN SELECT * FROM t WHERE a < 2 AND a > 2;+-------------------------+----------+-----------+---------------+------------------------------------+ | id | estRows | task | access object | operator info | +-------------------------+----------+-----------+---------------+------------------------------------+ | TableReader_7 | 0.00 | root | | data:Selection_6 | | └─Selection_6 | 0.00 | cop[tikv] | | gt(ssb_1.t.a, 2), lt(ssb_1.t.a, 2) | | └─TableFullScan_5 | 10000.00 | cop[tikv] | table:t | keep order:false, stats:pseudo | +-------------------------+----------+-----------+---------------+------------------------------------+ 3 rows in set (0.00 sec)式を
mysql.expr_pushdown_blacklistテーブルに挿入し、admin reload expr_pushdown_blacklistを実行します。INSERT INTO mysql.expr_pushdown_blacklist VALUES('<','tikv',''), ('>','tikv','');Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0admin reload expr_pushdown_blacklist;Query OK, 0 rows affected (0.00 sec)実行プランをもう一度観察すると、
<と>の両方のオペレーターがTiKVコプロセッサーにプッシュダウンされていないことがわかります。EXPLAIN SELECT * FROM t WHERE a < 2 and a > 2;+-------------------------+----------+-----------+---------------+------------------------------------+ | id | estRows | task | access object | operator info | +-------------------------+----------+-----------+---------------+------------------------------------+ | Selection_7 | 10000.00 | root | | gt(ssb_1.t.a, 2), lt(ssb_1.t.a, 2) | | └─TableReader_6 | 10000.00 | root | | data:TableFullScan_5 | | └─TableFullScan_5 | 10000.00 | cop[tikv] | table:t | keep order:false, stats:pseudo | +-------------------------+----------+-----------+---------------+------------------------------------+ 3 rows in set (0.00 sec)ブロックリストから1つの式(ここでは
>)を削除し、admin reload expr_pushdown_blacklistを実行します。DELETE FROM mysql.expr_pushdown_blacklist WHERE name = '>';Query OK, 1 row affected (0.01 sec)admin reload expr_pushdown_blacklist;Query OK, 0 rows affected (0.00 sec)実行プランをもう一度観察すると、
>がTiKVコプロセッサーにプッシュダウンされている間、<はプッシュダウンされていないことがわかります。EXPLAIN SELECT * FROM t WHERE a < 2 AND a > 2;+---------------------------+----------+-----------+---------------+--------------------------------+ | id | estRows | task | access object | operator info | +---------------------------+----------+-----------+---------------+--------------------------------+ | Selection_8 | 0.00 | root | | lt(ssb_1.t.a, 2) | | └─TableReader_7 | 0.00 | root | | data:Selection_6 | | └─Selection_6 | 0.00 | cop[tikv] | | gt(ssb_1.t.a, 2) | | └─TableFullScan_5 | 10000.00 | cop[tikv] | table:t | keep order:false, stats:pseudo | +---------------------------+----------+-----------+---------------+--------------------------------+ 4 rows in set (0.00 sec)