0

3 つのテーブルの内部結合を行うクエリがあります。

SELECT DISTINCT A.ID, <OTHER 'A' FIELDS> 
FROM C 
LEFT JOIN B ON C.Bin_ID = B.Bin_ID 
LEFT JOIN A ON B.App_ID = A.App_ID  
WHERE
   ((A.App_NAME LIKE '%%') AND (B.App_ID IS NOT NULL))  
ORDER BY 
    A.App_NAME ASC

言及されたテーブルに存在するデータ->

  • テーブル A: 8000 行
  • 表 B: 900000 行
  • 表 C: 10,00,000 行

以下は、SQL Server クエリ プランから明らかになった統計です。

ここでは、コストのかかる 2 つのインデックス シークが使用されています。上位のインデックス シークには、次の統計があります。

Object: B.App_ID [non clustered index, non unique] 
Seek Predicate: B.App_ID = A.App_ID[clustered index,unique]

ボトム インデックス シークには次の統計があります。

Object: C.Bin_ID [non clustered index, non unique] 
See Predicate: C.Bin_ID = B.Bin_ID[clustered index,unique]

現在、このクエリの実行には平均で 5 分かかりますが、クエリが既にインデックス シークを使用しているため、実行を高速化するために何をすべきかを理解できません。{結果セットにはすべての結合が必要です}。助けが必要 !

4

1 に答える 1

1

テーブルAから列のみをフェッチし、テーブルBで既存の行のみをチェックしているようです。

これで同じ結果が得られ、おそらく少し速くなると思います。

SELECT A.ID--, <OTHER 'A' FIELDS> 
FROM A
WHERE
   A.App_NAME LIKE '%%' AND 
   A.App_ID IN (SELECT B.App_ID
                FROM B
                  INNER JOIN C
                    ON B.Bin_ID = C.Bin_ID)
ORDER BY 
    A.App_NAME ASC
于 2011-11-01T06:28:35.833 に答える