tencent cloud

TDSQL-C for MySQL

statement outline

PDF
フォーカスモード
フォントサイズ
最終更新日: 2025-12-30 16:14:40

機能説明

SQL チューニングはデータベースのパフォーマンス最適化において非常に重要な要素です。オプティマイザが適切な実行計画を選択できないことによる影響を避けるため、TXSQL は実行計画をバインドするための OUTLINE 機能を提供します。TDSQL-C MySQL データベースには、HINT を使用して人為的に実行計画をバインドする機能があります。HINT 情報には、SQL が採用する最適化ルール、実行するアルゴリズム、データスキャンに使用するインデックスなどが含まれます。OUTLINE は主に HINT に基づいてクエリ計画を指定し、ユーザーが計画バインドルールを追加できるシステムテーブル mysql.outline を提供します。また、この機能を有効にするかどうかはスイッチ(cdb_opt_outline_enabled)で制御されます。

サポートバージョン

カーネルバージョンはTDSQL-C for MySQL 8.0の3.1.10以上です。

適用シーン

本番環境で実行計画が誤動作する場合、例えば実行計画がインデックスを誤選択したが、ビジネス側がSQL修正や再リリースによる解決を望まないシナリオです。

使用説明

OUTLINEの構文設定は新しい構文形式を採用します:
OUTLINE情報の設定:outline "sql" set outline_info "outline";
OUTLINE情報のクリア:outline reset ""; outline reset all;
OUTLINE情報のフラッシュ:outline flush;
以下にOUTLINEの主な使用方法を紹介します。以下のスキーマを例に説明します:
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
false
true/false
outline機能の有効化状態
説明:
ユーザーは現在、上記パラメータの値を直接変更することはできません。変更が必要な場合は、チケットを提出して変更を行ってください。

OUTLINEのバインド

直接的なOUTLINEのバインド方法は、あるSQLを別のSQLに置き換えるもので、SQLのセマンティクスは変更されず、オプティマイザの実行方法を指示するための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";

optimizer hintのバインド

機能をより柔軟にするために、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文にオプティマイザのヒントを追加します。一度に追加できるヒントは1つのみで、構文上は以下の3点に注意が必要です:
OPTキーワードは"の直後に続けるべきです。
バインドする必要がある新しいステートメントの前には必ず「:」が必要です。
2つのフィールド(クエリブロックの番号 #オプティマイザヒントの文字列)を追加する必要があり、中間は必ず#で分割する必要があります(つまり "OPT:1#max_execution_time(1000)")。

インデックスヒントのバインド

機能をより柔軟にするために、TXSQL は SQL にインデックスヒントを追加的に追加することを許可します。同じ機能は outline を直接バインドすることでも実現できます。 構文形式は次のとおりです:outline "sql" set outline_info "outline";。outline_info の後の文字列は "INDEX:" で始める必要があり、"INDEX:" の後に追加するインデックスヒント情報を記述します。 以下に例を示します: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 のクエリブロック 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を追加します。一度に追加できるHINTは1つのみで、構文上は以下の4点に注意が必要です:
INDEXキーワードは"の直後に続けるべきです。
バインドする必要がある新しいステートメントの前には必ず「:」が必要です。
5つのフィールド(クエリブロックの番号 #db_name#table_name#index_name#index_type#clause)を追加する必要があります。
INDEXタイプにはさらに3つの値があります(0はINDEX_HINT_IGNORE、1はINDEX_HINT_USE、2はINDEX_HINT_FORCE)。また、clauseには3つの値があります(1はFOR JOIN、2はFOR ORDER BY、3はFOR GROUP BY)。これらは必ず#で分割する必要があります(例:"INDEX:2#test#t2#idx2#1#1" は、2番目のクエリブロック内のtest.t2テーブルに、タイプがUSE INDEX FOR JOINであるidx2インデックスをバインドすることを表します)。

あるSQLに対応するOUTLINE情報を削除する

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";

すべてのOUTLINE情報をクリアする

TXSQLはユーザーがカーネル内のすべてのOUTLINEバインド情報を削除することを許可します。構文は次のとおりです:outline reset all。実行文は次のとおりです:outline reset all;
オンライン業務では、特定の問題が発生した場合にインデックスを強制的にバインドする必要があることがあります。このような場合、直接OUTLINEを設定してバインドすることが可能です。 OUTLINE設定後に発生する可能性のあるパフォーマンス低下を分析し、許容範囲内のパフォーマンス低下に留まるようにバインドを行い、必要に応じてカーネル担当者と協議する必要があります。

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック