Skip to content

Instantly share code, notes, and snippets.

@MasayukiOzawa
Created December 17, 2024 12:46
Show Gist options
  • Save MasayukiOzawa/3353578e38acf578b9585d406d63adba to your computer and use it in GitHub Desktop.
Save MasayukiOzawa/3353578e38acf578b9585d406d63adba to your computer and use it in GitHub Desktop.

アップロードされた実行プランファイル(XML形式)を解析し、SQL Serverクエリの効率向上に向けた提案を行います。まずは、XMLファイルを解析して内容を確認します。少々お待ちください。

チューニング対象クエリ

SELECT TOP 100 S_ACCTBAL, S_NAME, N_NAME, P_PARTKEY, P_MFGR, S_ADDRESS, S_PHONE, S_COMMENT
FROM PART, SUPPLIER, PARTSUPP, NATION, REGION
WHERE P_PARTKEY = PS_PARTKEY AND S_SUPPKEY = PS_SUPPKEY AND P_SIZE = 15 AND
P_TYPE LIKE '%BRASS' AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND
R_NAME = 'EUROPE' AND
PS_SUPPLYCOST = (SELECT MIN(PS_SUPPLYCOST) FROM PARTSUPP, SUPPLIER, NATION, REGION
 WHERE P_PARTKEY = PS_PARTKEY AND S_SUPPKEY = PS_SUPPKEY
 AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND R_NAME = 'EUROPE')
ORDER BY S_ACCTBAL DESC, N_NAME, S_NAME, P_PARTKEY

要約

このクエリは、条件に合うデータを複数のテーブルから結合し、PS_SUPPLYCOSTが特定の最小値である条件をサブクエリでチェックしています。結果は降順にソートされ、上位100件のみ取得します。


テーブル情報・統計情報・結合条件・述語

項目 内容
テーブル PART, SUPPLIER, PARTSUPP, NATION, REGION
結合条件 P_PARTKEY = PS_PARTKEY, S_SUPPKEY = PS_SUPPKEY
述語 P_SIZE = 15, P_TYPE LIKE '%BRASS', R_NAME = 'EUROPE'
サブクエリ PS_SUPPLYCOST = (SELECT MIN(PS_SUPPLYCOST) ... WHERE R_NAME = 'EUROPE')

コストが高い操作

操作 詳細
Nested Loop Join サブクエリ内での重複計算が発生
テーブルスキャン 統計情報不足または索引不使用
ソート操作 (ORDER BY) S_ACCTBAL による降順ソート

チューニング提案

  1. インデックス追加

    • PART: (P_SIZE, P_TYPE)
    • PARTSUPP: (PS_PARTKEY, PS_SUPPLYCOST)
    • REGION: (R_NAME)
    • NATION: (N_REGIONKEY)
  2. サブクエリの見直し
    サブクエリのMIN(PS_SUPPLYCOST)は効率が悪いため、CROSS APPLYを利用してリライトすることでパフォーマンスが向上します。

リライト後のクエリ

SELECT TOP 100 S_ACCTBAL, S_NAME, N_NAME, P_PARTKEY, P_MFGR, S_ADDRESS, S_PHONE, S_COMMENT
FROM PART
JOIN PARTSUPP ON P_PARTKEY = PS_PARTKEY
JOIN SUPPLIER ON S_SUPPKEY = PS_SUPPKEY
JOIN NATION ON S_NATIONKEY = N_NATIONKEY
JOIN REGION ON N_REGIONKEY = R_REGIONKEY
CROSS APPLY (
    SELECT MIN(PS_SUPPLYCOST) AS MinSupplyCost
    FROM PARTSUPP PS
    JOIN SUPPLIER S2 ON S2.S_SUPPKEY = PS.PS_SUPPKEY
    JOIN NATION N2 ON S2.S_NATIONKEY = N2.N_NATIONKEY
    JOIN REGION R2 ON N2.N_REGIONKEY = R2.R_REGIONKEY
    WHERE PS.PS_PARTKEY = PART.P_PARTKEY AND R2.R_NAME = 'EUROPE'
) AS SubCost
WHERE P_SIZE = 15 AND P_TYPE LIKE '%BRASS' AND R_NAME = 'EUROPE' AND PS_SUPPLYCOST = SubCost.MinSupplyCost
ORDER BY S_ACCTBAL DESC, N_NAME, S_NAME, P_PARTKEY
  1. 実行プラン警告の確認
    • Missing Index(欠落インデックス): PS_SUPPLYCOSTP_SIZE を含む索引が不足
    • ソート操作の最適化: 降順ソートをインデックスでカバーする

クエリの問題点まとめ

  • サブクエリのMINが繰り返し評価されることで高コストとなっている。
  • インデックスが欠落しており、テーブルスキャンが発生。
  • ORDER BYのソート操作が効率を低下させている。

提案内容を実施することで、クエリの効率が大幅に向上する可能性があります。

===
解析対象のファイル:
- アップロードしたファイル
===
あなたの役割:
- あなたは SQL Server の専門家です。クエリの実行効率の向上のために詳細な調査を実施してください。
===
分析方法:
- 対象のファイルは SQL Server の実行プランの XML ファイル
- このファイルの内容は Code Interpreter で解析をするのではなく、プロンプト内に内容を展開して回答を生成
- ファイル内に複数のステートメントが含まれている場合、各ステートメントごとに分析
===
回答内容:
- クエリチューニングの提案
- 冒頭にチューニング対象となるクエリの SQL と内容の要約を回答
- 使用しているテーブルの情報/統計情報の情報/結合条件/述語を表形式で記載
- クエリチューニングにはインデックス / JOIN 方法の変更 / 検索条件の見直し / クエリヒント、テーブルヒント句の追加 / サブクエリの見直しについての情報を含める
- クエリのリライトにより効率が向上する場合には、リライト後のクエリの提案
- コストが高い操作の情報を表形式でまとめる
- 実行プランの XML 内にMissing Index / Missing Stats / Warning がある場合は、抽出した情報を回答
- 回答の最後にこのクエリの問題点を要約した内容を表示
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment