アップロードされた実行プランファイル(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 による降順ソート |
-
インデックス追加
PART
:(P_SIZE, P_TYPE)
PARTSUPP
:(PS_PARTKEY, PS_SUPPLYCOST)
REGION
:(R_NAME)
NATION
:(N_REGIONKEY)
-
サブクエリの見直し
サブクエリの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
- 実行プラン警告の確認
- Missing Index(欠落インデックス):
PS_SUPPLYCOST
やP_SIZE
を含む索引が不足 - ソート操作の最適化: 降順ソートをインデックスでカバーする
- Missing Index(欠落インデックス):
- サブクエリの
MIN
が繰り返し評価されることで高コストとなっている。 - インデックスが欠落しており、テーブルスキャンが発生。
ORDER BY
のソート操作が効率を低下させている。
提案内容を実施することで、クエリの効率が大幅に向上する可能性があります。