SQLチューニングはデータベースのパフォーマンス最適化において非常に重要なプロセスの一つです。オプティマイザが適切な実行計画を選択できないことによる影響を防ぐため、TXSQLはOUTLINE機能を提供し、ユーザーが実行計画をバインドできるようにしました。MySQLデータベースにはHINTによって実行計画を人為的にバインドできる機能があります。HINT情報には、SQLがどの最適化ルールを採用しているか、どのアルゴリズムを実行しているか、データスキャンにどのインデックスを採用しているかなどが含まれます。OUTLINEは主にHINTによって照会計画を指定するもので、弊社はシステムテーブルmysql.outlineを提供し、ユーザーが計画バインドルールを追加できるようにしています。この機能をオンにするかどうかはスイッチ(cdb_opt_outline_enabled)で制御します。
カーネルバージョン MySQL 8.0 20201230およびそれ以降
オンライン実行計画のインデックス選択ミスなど、オンラインでの実行計画に誤りがあったが、業務上、SQLを変更して新バージョンをリリースする解決方法を取りたくないケース。
OUTLINE構文の設定に用いる新しい構文形式:
outline "sql" set outline_info "outline";
outline reset ""; outline reset all;
outline flush;
次にOUTLINEの主な使用方法を紹介します。以下のschemaを例に説明します。
create table t1(a int, b int, c int, primary key(a));
create table t2(a int, b int, c int, unique key idx2(a));
create table t3(a int, b int, c int, unique key idx3(a));
パラメータ名 | 動的 | タイプ | デフォルト | パラメータ値範囲 | 説明 |
---|---|---|---|---|---|
cdb_opt_outline_enabled | yes | bool | fasle | true/false | outline機能をオンにするかどうか |
説明:ユーザーは現在、上記パラメータのパラメータ値を直接変更することはできません。変更する場合は、チケットを提出から変更することができます。
OUTLINEの直接バインド方式とは、1文のSQLを、SQLの意味は変えずに別の1文に置き換えるもので、いくつかのHINT情報を追加して、どう実行するかをオプティマイザに通知するだけのものです。
構文形式はoutline "sql" set outline_info "outline";
です。outline_infoの後の文字列は必ず"OUTLINE:"で開始し、"OUTLINE:"の後にHINTの後のSQLを追加することに注意してください。例えば、select *from t1, t2 where t1.a = t2.a
というSQLのt2テーブルにa列のインデックスを加えます。
outline "select* from t1, t2 where t1.a = t2.a" set outline_info "OUTLINE:select * from t1, t2 use index(idx2) where t1.a = t2.a";
機能をさらに柔軟にするため、TXSQLでは、SQL中にoptimizer hintを増分追加することが許容されています。同様の機能はoutlineの直接バインドによっても実現できます。
構文形式はoutline "sql" set outline_info "outline";
です。outline_infoの後の文字列は必ず"OPT:"で開始し、"OPT:"の後を追加したいoptimizer hint情報とすることに注意してください。例えば、select *from t1 where t1.a in (select b from t2)
というSQLにMATERIALIZATION/DUPSWEEDOUTのSEMIJOINを指定します。
outline "select* from t1 where t1.a in (select b from t2)" set outline_info "OPT:2#qb_name(qb2)";
outline "select * from t1 where t1.a in (select b from t2)" set outline_info "OPT:1#SEMIJOIN(@qb2 MATERIALIZATION, DUPSWEEDOUT)";
オリジナルのSQLステートメントにOPTIMIZERのHINTを追加する場合は、1回につき1個のHINTの追加のみサポートしています。構文については3つの点に注意する必要があります。
ie. "OPT:1#max_execution_time(1000)"
)。機能をさらに柔軟にするため、TXSQLでは、SQL中にindex hintを増分追加することが許容されています。同様の機能はoutlineの直接バインドによっても実現できます。
構文形式はoutline "sql" set outline_info "outline";
です。outline_infoの後の文字列は必ず"INDEX:"で開始し、"INDEX:"の後を追加したいindex hint情報とすることに注意してください。
次に例を挙げます。select *from t1 where t1.a in (select t1.a from t1 where t1.b in (select t1.a from t1 left join t2 on t1.a = t2.a))
というSQLのquery block 3上のデータベースtest下のt1テーブルにUSE INDEXのインデックスidx1を追加します。タイプはFOR JOINです。
outline "select* from t1 where t1.a in (select t1.a from t1 where t1.b in (select t1.a from t1 left join t2 on t1.a = t2.a))" set outline_info "INDEX:3#test#t1#idx1#1#0";
オリジナルのSQLステートメントにINDEXのHINTを追加する場合は、1回につき1個のHINTの追加のみサポートしています。構文については4つの点に注意してください。
ie. "INDEX:2#test#t2#idx2#1#0"
は2番目のquery block中のtest.t2テーブル中に、タイプがUSE INDEX FOR JOINであるidx1インデックスをバインドすることを表す)。TXSQLでは、ユーザーがあるSQLステートメントのOUTLINEバインド情報を削除することが許容されています。
構文はoutline reset "sql";
であり、select *from t1, t2 where t1.a = t2.a
のoutline情報を削除する場合は、outline reset "select* from t1, t2 where t1.a = t2.a";
となります。
TXSQLでは、ユーザーがカーネル内のすべてのOUTLINEバインド情報を削除することが許容されています。構文はoutline reset all
、実行ステートメントはoutline reset all;
です。
オンライン業務中には、時にいくつかの非常に特殊な問題が発生し、強制的にインデックスをバインドする必要が生じることがあります。その場合は直接OUTLINEを設定してバインドすることができます。
OUTLINEの設定後に起こる可能性のあるパフォーマンスの後退を分析し、許容可能なパフォーマンス後退の範囲でバインドを行う必要があります。 必要に応じ、カーネル担当者と相談してください。
TXSQLはユーザーのSQLのOUTLINEバインドを確認するための様々な方法を提供しています。まず、mysql.outlineテーブルを通じてユーザーのOUTLINE設定状況を確認できます。次に、show cdb_outline_info、select * from information_schema.cdb_outline_infoという2つのインターフェースによって、メモリ内のOUTLINE情報を確認できます。入力したSQLが変更可能かどうかは、メモリ内にOUTLINE情報があるかどうかによって決まるため、ユーザーはこの2つのインターフェースを使用してデバッグを行うことができます。
mysql.outlineシステムテーブルが追加され、ユーザーが設定したOUTLINE情報のレコードはこのテーブルに保存されます。このテーブルのフィールドは次のとおりです。
フィールド名 | 説明 |
---|---|
Id | OUTLINE設定情報番号 |
Digest | オリジナルSQLステートメントのハッシュ値 |
Digest_text | オリジナルSQLステートメントの指紋情報テキスト |
Outline_text | OUTLINEバインド後のSQLステートメントの指紋情報テキスト |
show cdb_outline_infoまたはselect * from information_schema.cdb_outline_infoでもメモリ内のレコードを確認でき、SQLを実行するとその中のOUTLINEレコードバインド計画にヒットする場合があります。パラメータは次のとおりです。
フィールド名 | 説明 |
---|---|
origin | オリジナルSQLステートメントの指紋 |
outline | OUTLINEバインド後のSQLステートメントの指紋 |
この記事はお役に立ちましたか?