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が実行されるため、速度に大差ないのではないかと予測していましたが、実際には歴然とした違いとなりました。