最適化ルールのブロックリストと式のプッシュダウン
このドキュメントでは、最適化ルールのブロックリストと式プッシュダウンのブロックリストを使用して、TiDB の動作を制御する方法を紹介します。
最適化ルールのブロックリスト
最適化ルールのブロックリストは、最適化ルールを調整する 1 つの方法であり、主にいくつかの最適化ルールを手動で無効にするために使用されます。
重要な最適化ルール
最適化ルール | ルール名 | 説明 |
---|---|---|
カラムの剪定 | column_prune | 上位エグゼキューターが列を必要としない場合、1 人のオペレーターが列を整理します。 |
サブクエリの関連付けを解除する | 関連付けを解除する | 相関サブクエリを非相関結合または集約に書き換えようとします。 |
集計除去 | アグリゲーション_エリミネート | 実行計画から不要な集計演算子を削除しようとします。 |
突起除去 | プロジェクション_エリミネート | 実行計画から不要な射影演算子を削除します。 |
最大/最小除去 | max_min_eliminate | 集計の一部の max/min関数をorder by + limit 1 形式に書き換えます。 |
述語のプッシュダウン | predicate_push_down | データ ソースに近い演算子に述語を押し下げようとします。 |
外部結合の削除 | outer_join_eliminate | 不要な左結合または右結合を実行計画から削除しようとします。 |
パーティションの剪定 | partition_processor | 述語によって拒否されたパーティションを削除し、パーティション テーブル クエリをUnionAll + Partition Datasource 形式に書き換えます。 |
集計プッシュダウン | アグリゲーションプッシュダウン | 集計を子にプッシュしようとします。 |
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 つの方法であり、主に特定のデータ型の式を手動で無効にするために使用されます。
プッシュ ダウンがサポートされている式
式の分類 | 具体的な操作 |
---|---|
論理演算 | AND (&&)、OR ( |
比較関数と演算子 | <、<=、=、!= ( <> )、>、>=、 <=> 、IS NULL、LIKE、IS TRUE、IS COALESCE() 、 IN() |
数値関数と演算子 | +, -, *, /, ABS() , CEIL() , CEILING() , FLOOR() |
制御フロー関数 | CASE 、 IF() 、 IFNULL() |
JSON関数 | JSON_TYPE(json_val) , JSON_EXTRACT(json_doc, パス[, パス] ...) 、 JSON_UNQUOTE(json_val) , JSON_OBJECT(key, val[, key, val] ...) 、 JSON_ARRAY([値[, 値] ...]) , JSON_MERGE(json_doc, json_doc[, json_doc] ...) , JSON_SET(json_doc, パス, val[, パス, val] ...) , JSON_INSERT(json_doc, パス, val[, パス, val] ...) , JSON_REPLACE(json_doc, パス, val[, パス, val] ...) 、 JSON_REMOVE(json_doc, パス[, パス] ...) |
日付と時刻関数 | DATE_FORMAT() |
特定の式のプッシュダウンを無効にする
式のプッシュダウンが原因で間違った結果が得られた場合は、ブロックリストを使用してアプリケーションの迅速な回復を行うことができます。具体的には、サポートされている関数または演算子の一部を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
、tikv
、およびtiflash
です。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 Coprocessor にプッシュされていないことがわかります。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)