Persist plan と Query-Blocker を使用すると、AnalyticDB for MySQL がパラメータ化された SQL 文を実行する方法を直接制御できます。Persist plan を使用して、ステートメントパターンに特定のオプティマイザヒントを固定し、Query-Blocker を使用して、同じパターンに一致する文をインターセプトしてブロックします。これは SQL ファイアウォールとして機能します。これらの機能は両方とも V3.1.4 以降が必要です。
仕組み
AnalyticDB for MySQL は、WHERE や LIMIT などの句の定数を疑問符 (?) に置き換えることで、文をパラメータ化し、同じ構造を共有する文を識別します。パターンと呼ばれる各一意の構造は、そのパターンのハッシュ識別子であるサイン値を取得します。
Persist plan は、オプティマイザヒントをパターンにアタッチします。パターンに一致するすべての文は、元の SQL を変更することなく、それらのヒントが適用されて実行されます。
Query-Blocker も同様に機能しますが、実行をチューニングする代わりに、パターンに一致するすべての文を拒否します。
高度な最適化機能がクラスターで有効になっている場合、広範囲の文が影響を受ける可能性があります。Persist plan を使用して、同じパターンを共有する文にどのヒントを適用するかを制御できます。
PERSIST_PLANまたは/*+query_blocker=true*/ PERSIST_PLANを実行しても、ターゲット SQL ステートメントは実行されません。ヒント構成のみが保存されます。
各機能の利用シーン
| 状況 | 機能 |
|---|---|
| オプティマイザーが類似のクエリのグループに対して最適ではない実行計画を選択している場合 | Persist plan |
| 類似のクエリのグループがパフォーマンスの問題を引き起こしており、直ちに停止する必要がある場合 | Query-Blocker |
前提条件
開始する前に、以下があることを確認してください。
V3.1.4 以降を実行している AnalyticDB for MySQL クラスター
MySQL クライアントへのアクセス (
PERSIST_PLAN_CHECKに必要 — Data Management (DMS) はこのコマンドの結果を返しません)
構文リファレンス
| 操作 | 構文 |
|---|---|
| 文のパターンとサイン値を生成 | PARAMETERIZE $sql |
| パターンにヒントをアタッチ | /*+hints*/ PERSIST_PLAN $sql |
| パターンに一致するすべての文をブロック | /*+query_blocker=true*/ PERSIST_PLAN $sql |
| 文にヒントが構成されているか確認 | PERSIST_PLAN_CHECK $sql |
| ヒントを持つすべてのパターンを一覧表示 | SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY |
| SQL ステートメントでヒントを削除 | DELETE_PLAN $sql |
| サイン値でヒントを削除 | DELETE_PLAN_BY_SIGN $Sign |
Persist plan の例
パターンとサイン値の生成
文で PARAMETERIZE を実行して、AnalyticDB for MySQL がそれをどのように正規化し、どのようなサイン値を取得するかを確認します。
PARAMETERIZE
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;結果:
| サイン | パターン |
|---|---|
| 2506ed2c1f53ea59a1ef996a98a50411 | SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < ? |
サイン値は、このパターンを一意に識別します。これを使用して、フル SQL を再指定することなく Persist plan を削除できます。
パターンにヒントをアタッチ
パターンに一致するすべての文に nested_loop_join アルゴリズムを適用するには:
/*+nested_loop_join=true*/
PERSIST_PLAN
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;パターンに一致する文をブロック
パターンに一致するすべての文をインターセプトするには:
/*+query_blocker=true*/
PERSIST_PLAN
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;Persist plan の削除
2つのメソッドが利用可能です。
SQL ステートメントによる:
DELETE_PLAN
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;サイン値による:
DELETE_PLAN_BY_SIGN 2506ed2c1f53ea59a1ef996a98a50411;パターンのサイン値を取得するには、PARAMETERIZE $sql を実行するか、INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY をクエリします。
Persist plan の検証と監視
特定の文のヒントを確認
PERSIST_PLAN_CHECK を実行して、Persist plan が構成されていることを確認し、適用された回数を確認します。
PERSIST_PLAN_CHECK
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;結果:
| サイン | ヒント | hitApplied | パターン |
|---|---|---|---|
| 2506ed2c1f53ea59a1ef996a98a50411 | nested_loop_join=true | 12 | SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < ? |
フィールドの説明:
| フィールド | 説明 |
|---|---|
Sign | パターンのハッシュ識別子 |
Hint | パターンに現在設定されているヒントワード |
hitApplied | 永続化プランが作成または最終更新されてからパターンが一致した回数。更新のたびに 0 にリセットされます。 |
Pattern | 文のパラメーター化された形式。定数は ? |
Data Management (DMS) で実行した場合、PERSIST_PLAN_CHECK は結果を返しません。出力を確認するには、MySQL クライアントから実行してください。
構成されているすべてのパターンを一覧表示
SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY;このクエリは、現在 Persist plan が構成されているすべてのパターンを、それらのヒントとサイン値とともに返します。