Database Autonomy Service ( DAS ) は、クエリガバナンス機能を提供します。毎日 01:00:00 に、システムは前日にデータベースインスタンスで実行されたすべてのスロークエリを自動的に分析し、重大度レベルに基づいて SQL テンプレートにタグを追加します。これは、スロークエリの分類と最適化に役立ちます。DAS は、SQL テンプレートの最適化に関する提案も提供し、クエリガバナンスデータをエクスポートすることもできます。
前提条件
管理するデータベースインスタンスが次のいずれかのタイプであること。
ApsaraDB RDS for MySQL
PolarDB for MySQL
ApsaraDB MyBase for MySQL
ApsaraDB RDS for PostgreSQL
データベースインスタンスが中国本土、中国(香港)リージョン、またはシンガポールリージョンにデプロイされていること。
説明2023 年 4 月 1 日以降、中国(香港)およびシンガポールリージョンにあるデータベースインスタンスでクエリガバナンス機能がサポートされています。
制限事項
クエリガバナンス機能は、トランザクションの翌日(T+1)にオフラインデータを分析することによって実装されます。たとえば、最適化不要 タグを SQL テンプレートに追加すると、翌日には最適化する必要がある SQL テンプレートからその SQL テンプレートが削除されます。
システムによって追加されたタグは変更または削除できません。
データベースインスタンスごとに、DAS は最も頻繁に実行される上位 200 件のスロークエリのみをカウントして分析します。これは、データベースインスタンスのスロー SQL テンプレートの最大数が 200 であることを示しています。
用語
用語 | 説明 |
最適化可能な SQL | スロークエリを引き起こし、最適化する必要がある SQL テンプレート。 |
最適化する必要のない SQL テンプレート | スロークエリを引き起こし、DAS が DAS を無視 タグを自動的に追加する SQL テンプレート、またはユーザーが 最適化不要 タグを追加する SQL テンプレート。 |
DAS を無視 | スロークエリを引き起こし、DAS が自動的に 最適化不要 タグを追加する SQL テンプレート。これらの SQL テンプレートには、 |
手順
- DAS コンソール にログインします。
左側のナビゲーションウィンドウで、[インテリジェント O&M センター] > クエリのガバナンス を選択します。
クエリのガバナンス ページで、クエリガバナンスの結果を表示します。
時間、リージョン、データベースエンジンを指定し、1 つ以上のインスタンス ID を入力して、以下のセクションに表示される指定されたデータベースインスタンスのクエリガバナンス結果を表示できます。
[概要]: このセクションには、SQL テンプレートが分類され、タグが追加された後のクエリガバナンス結果が表示されます。
説明SQL 実行の失敗回数 を表示するには、DAS Enterprise Edition を購入する必要があります。
[トレンドチャート]: このセクションには、特定の期間におけるクエリガバナンス結果の変化のトレンドが表示されます。
上位ランキング: このセクションには、最もパフォーマンスの高いインスタンス チャートと 最もパフォーマンスの低いインスタンス チャートが表示されます。
最低パフォーマンスのインスタンス: データベースインスタンスは、各インスタンスで実行されたスロークエリの数に基づいて降順に表示されます。これは、最も多くのスロークエリが実行されたインスタンスを特定するのに役立ちます。
最高パフォーマンスのインスタンス: データベースインスタンスは、各インスタンスで実行されたスロークエリの数の変化に基づいて昇順に表示されます。負の値は、前日に実行されたスロークエリの数と比較して、実行されたスロークエリの数が少ないことを示します。正の値は、前日に実行されたスロークエリの数と比較して、実行されたスロークエリの数が多いことを示します。これは、SQL 最適化が最も効果的なインスタンスを特定するのに役立ちます。
最も多くのスロークエリが実行されたインスタンスと、SQL 最適化が最も効果的なインスタンスにすぐに注意することをお勧めします。
最適化対象の SQL: フィルター条件を指定して、管理する SQL 文をフィルタリングできます。
説明データベース名、SQL キーワード、ルールタグ、データベースアカウントのユーザー名など、次のフィルター条件を指定できます。4 つのフィルター条件は、AND 演算子を使用して評価されます。
複数のデータベース名はコンマ(,)で区切ります。データベース名は OR 演算子を使用して評価されます。
複数の SQL キーワードはスペースで区切ります。SQL キーワードは AND 演算子を使用して評価されます。
複数のデータベースアカウントのユーザー名はコンマ(,)で区切ります。ユーザー名は OR 演算子を使用して評価されます。
複数のルールタグを選択できます。選択したルールは OR 演算子を使用して評価されます。
SQL 文のサンプルを見つけて、操作 列の 提案 をクリックして、クエリガバナンスに関する提案を表示できます。
SQL 文のサンプルを見つけて、操作 列の タグの追加 をクリックして、SQL 文にタグを追加できます。タグの詳細については、このトピックのタグの説明を参照してください。
複数の SQL 文のサンプルを選択して、一度にそれらの SQL 文にタグを追加することもできます。
SQL 文のサンプルを見つけて、操作 列の [サンプル] をクリックして、SQL 文のスロークエリログを表示できます。
SQL 文のサンプルを見つけて、操作 列の 推移 をクリックして、SQL 文のスロークエリログ分析の詳細を表示できます。スロークエリの分析と管理方法の詳細については、スロークエリログ分析を参照してください。
ビジネス要件に基づいて、最適化する SQL テンプレートのデータをエクスポートおよび共有できます。詳細については、このトピックのベストプラクティスセクションを参照してください。
失敗した SQL: フィルター条件を指定して、表示する SQL 文をフィルタリングできます。
説明失敗した SQL を表示するには、DAS Enterprise Edition を購入する必要があります。
データベース名と SQL キーワードを指定して、SQL 文をフィルタリングできます。フィルター条件は、AND 演算子を使用して評価されます。
複数のデータベース名はコンマ(,)で区切ります。データベース名は OR 演算子を使用して評価されます。
複数の SQL キーワードはスペースで区切ります。SQL キーワードは AND 演算子を使用して評価されます。
SQL 文のサンプルを見つけて、操作 列の [サンプル] をクリックして、SQL 文の詳細を表示できます。
ベストプラクティス
タグを使用して、最適化する必要がある SQL テンプレートを識別します。
クエリガバナンス機能は、スロークエリを引き起こす SQL テンプレートを 2 つのカテゴリに分類します。最適化する必要のない SQL テンプレートと最適化する必要がある SQL テンプレートです。タグを使用して SQL テンプレートをフィルタリングし、タグで示される重大度レベルに基づいて SQL テンプレートを最適化できます。次の表に、DAS でサポートされているタグを示します。
ID
名前
重大度レベル
すぐに対応が必要
説明
NEW_SQL
新しいスロー SQL
致命的
✔️
過去 7 日間にスロークエリを引き起こした SQL テンプレート。
DAS_IGNORE
無視
普通
➖
DAS が 最適化不要 タグを自動的に追加する SQL テンプレート。これらの SQL テンプレートには、
SHOW
、CREATE
、XA
、COMMIT
、ROLLBACK
、SELECT SLEEP
、またはEXPLAIN
文で始まる SQL テンプレートが含まれます。FUZZY_LIKE
LIKE クエリ
普通
➖
LIKE
演算子を使用してあいまい一致を実装する SQL テンプレート。LIKE 演算子を含むクエリでは、インデックスを使用できません。HAS_EXPR
式が含まれている
普通
➖
計算式を含む SQL テンプレート。関連する列にはインデックスを使用できません。
LARGE_IN_LIST
大きなリストクエリ
普通
➖
IN
演算子に 200 を超える要素が指定されている SQL テンプレート。このような SQL テンプレートは、プログラムによって自動生成される場合があります。関係する列でインデックスを使用することはできません。SELECT_STAR
全カラムクエリ
普通
➖
SELECT
句に 1 つ以上のフィールドが指定されているものの、条件が指定されていない SQL テンプレート。条件を指定しないと、不要なデータのクエリにリソースが浪費されます。これにより、クエリのパフォーマンスが低下します。INDEX_ADVISOR
インデックスの提案
普通
✔️
インデックスが作成されていないテーブルからデータをクエリするために使用される SQL テンプレート。SQL クエリを高速化するために、インデックスを作成して使用することをお勧めします。
COMPLEX_JOIN
複雑な JOIN クエリ
普通
➖
3 つ以上のテーブルを結合するために JOIN オペレーターが使用されている SQL テンプレート。
JOIN
オペレーターを使用して 3 つ以上のテーブルを結合することはできません。結合するテーブル内の指定されたフィールドのデータ型は同じである必要があります。複数のテーブルを結合する前に、テーブル内でクエリを実行するフィールドのインデックスを作成してください。CROSS_DB
クロスデータベースクエリ
普通
➖
異なるデータベースのデータをクエリするために使用される SQL テンプレート。データベースまたはテーブルが元のデータベースインスタンスから別のデータベースインスタンスに移行されると、クロスデータベースクエリは失敗する可能性があります。
SUBQUERY
サブクエリが含まれている
普通
➖
サブクエリ用の SQL 文を含む SQL テンプレート。クエリをより効率的にするために、SQL テンプレートを書き直し、
JOIN
演算子を使用することをお勧めします。DEEP_PAGING
ディープページング
致命的
➖
深いページングメソッドを実装するために
LIMIT
演算子が使用されている SQL テンプレート。SQL テンプレートを書き直し、LIMIT 演算子の代わりに JOIN 演算子を使用することをお勧めします。WITHOUT_PREDICATE
述語なし
致命的
✔️
述語を含まない SQL テンプレート。ビジネスで全表スキャンが必要かどうかを確認します。ビジネスで全表スキャンが不要な場合は、SQL テンプレートを書き直します。
NULL_COMPARE
NULL 一致エラー
致命的
➖
ISNULL()
NULL
NULL
関数を使用して 値を確認する SQL テンプレート。値のいずれかが NULL の場合、 が返されるため、ISNULL() 関数を使用して NULL 値を見つけることはできません。COUNT_NOT_STAR
無効な COUNT 構文
致命的
➖
無効な COUNT 構文を含む SQL テンプレート。
COUNT(*)
を使用してデータレコードの数をクエリします。COUNT (Column name)
またはCOUNT (Constant)
構文を使用しないでください。COUNT(*)
は、行数をクエリするために SQL92 で定義されている標準構文です。COUNT(*) 構文は、NULL
値を含むデータレコードの数をカウントし、すべての種類のデータベースで実行できます。COUNT (Column name)
構文は、NULL
値をカウントしません。LARGE_ROWS_EXAMINED
過剰なスキャン行数
普通
➖
平均して 50,000 行以上をスキャンするために使用される SQL テンプレート。行数が多いほど、消費されるデータベースリソースの量が多くなります。これにより、SQL クエリの実行速度が低下し、他の SQL クエリに影響します。
説明SQL 文でより具体的なフィルター条件を使用することをお勧めします。
LARGE_ROWS_SENT
過剰な戻り行数
普通
➖
平均して 5,000 行以上のデータが返されるクエリで使用される SQL テンプレート。SQL テンプレートを変更して、戻り行数を減らすことをお勧めします。
NO_ADVICE
提案なし
普通
➖
提案はありません。
PERIOD_SQL
定期的
普通
➖
毎日特定の時間に実行される SQL テンプレート。
最適化する必要がある SQL テンプレートにすぐに注意することをお勧めします。システムが毎日スロークエリを分析する前に、次の表に示すタグのいずれかを SQL テンプレートに手動で追加できます。これにより、最適化する必要がある SQL テンプレートの数を減らすことができます。
ID
名前
重大度レベル
説明
USER_IGNORE
最適化する必要なし
普通
このタグを SQL テンプレートに追加すると、翌日には最適化する必要がある SQL テンプレートとしてカウントされなくなります。
DAS_IMPORTANT
優先度の高い SQL
普通
優先度の高い SQL テンプレートにこのタグを追加します。
DAS_NOT_IMPORTANT
優先度の低い SQL
普通
優先度の低い SQL テンプレートにこのタグを追加します。
DAS_IN_PLAN
後で最適化
普通
後で最適化する SQL テンプレートにこのタグを追加します。
データをエクスポートします。
SQL の詳細 セクションの右上隅にある [エクスポート] をクリックして、フィルタリングされた SQL テンプレートのデータをエクスポートします。
説明エクスポートされたデータは 3 日間ダウンロードできます。
さまざまな条件を指定して SQL テンプレートをフィルタリングできます。たとえば、データベースまたはルールタグに基づいて SQL テンプレートをフィルタリングし、ダウンロードタスクを作成してから、データベースまたはルールタグに基づいて異なる所有者を割り当てて SQL テンプレートを最適化できます。
複数の SQL テンプレートを選択して、選択した SQL テンプレートのデータをエクスポートすることもできます。
データを共有します。
SQL テンプレートをフィルタリングし、フィルタリングされた SQL テンプレートを対応する SQL テンプレートの所有者と共有できます。次のいずれかの方法を使用してデータを共有できます。
SQL テンプレートを選択し、セクションの下部にある 一括共有 をクリックします。システムによって URL が生成されます。URL が転送されるページには、選択した SQL テンプレートに関する情報が表示されます。DAS の権限が付与されている場合は、ページにアクセスして、選択した SQL テンプレートに関する情報を表示できます。
条件を指定して SQL テンプレートをフィルタリングし、エクスポート の右側にある 共有 をクリックします。システムによって URL が生成されます。URL が転送されるページには、フィルタリングされた SQL テンプレートに関する情報が表示されます。DAS の権限が付与されている場合は、ページにアクセスして、フィルタリングされたすべての SQL テンプレートに関する情報を表示できます。
関連 API 操作
操作 | 説明 |
SQL テンプレートに 1 つ以上のタグを追加します。 | |
実行に失敗した SQL テンプレートをクエリします。 | |
SQL テンプレートで失敗した SQL 文をクエリします。 | |
SQL テンプレートを最適化するためにクエリガバナンス機能によって提供される提案をクエリします。 | |
データベースインスタンスのスロークエリにクエリガバナンス機能によって追加されたタグのリストをクエリします。 | |
クエリガバナンス機能のトレンドデータをクエリします。 | |
クエリガバナンスデータに基づいて、最高パフォーマンスおよび最低パフォーマンスのデータベースインスタンスに関する情報をクエリします。 | |
クエリガバナンスデータに基づいて SQL テンプレートに関する情報をクエリします。 | |
SQL テンプレートのタグをクエリします。 | |
クエリガバナンス機能の共有 URL をクエリします。 |