SQL: JOIN, GROUP BY, WHERE, ORDER BYが遅い。WHERE句の位置を変えたら速くなった

JOINしたテーブルにWHEREで条件指定し、GROUP BYでSUMを出す。WHERE句の位置を変えたところ、高速化しました。事情がありINDEXは使っていません。

使用データベース

SQL SERVER 12.0.2000

内容

Table_A.idとTable_Bは、Table_AのidとTable_BのカラムA_idでひもづいています。
Table_Aのデータ、Table_Bのデータは、共に約35万件です。
Table_AとTable_BをJOINして、WHERE句で条件を指定、GROUP BYしSUMで合計を出しました。下記のような内容です。


  SELECT T1.売上日, T1.品目, T2.店舗, T2.SUM(販売額) AS ‘売上’’
FROM Table_A T1
LEFT JOIN Table_B T2
ON T1.id = T2.A_id
WHERE T1 .売上日 = ‘2020-10-01’
AND T2.店舗 = ‘渋谷店’

GROUP BY T1.売上日, T1.品目, T2.店舗, T2.販売額
ORDER BY T1.品目;

このクエリの結果は12.083秒かかりました。
これを下記のように変更しました。


SELECT T1.売上日, T1.品目, T2.店舗, T2..SUM(販売額) AS ‘売上’’
FROM (SELECT id, 売上日, 品目, FROM Table_A WHERE 売上日 = ‘2020-10-01’) T1 
LEFT JOIN (SELECT A_id, 店舗, 販売額 FROM Table_B WHERE 店舗 = ‘渋谷店’) T2
ON Table_A.id = Table_B.A_id
GROUP BY T1.売上日, T1.品目, T2.店舗, T2.販売額
ORDER BY T1.品目;

変更後は0.037秒になりました。
WHERE BYを、テーブルのJOIN前に入れたことになります。
両方とも、GROUP BYをしないと1秒かかりませんが、前者は、0.07秒、後者は0.037秒でこの時点で倍くらいの差がついています。
後者は、GROUP BY、ORDER BYを入れた途端に遅くなります。

JOINされたテーブルに、WHERE条件で抽出された件数は同じになり、
その後にGROUP BY, ORDER BYが実行されるため、速度に大差ないのではないかと予測していましたが、実際には歴然とした違いとなりました。

SNSでもご購読できます。

コメントを残す

*