私は毎日このサイトにアクセスしていますが、これまで投稿したことはありません。クエリに時間がかかる理由を理解するのに苦労しています。
SQL Serverは行の範囲を返すことをサポートしていないため、かなり凝ったものにする必要がありました。そのため、
SELECT FROM
(SELECT ROW_NUMBER() AS rownum...)
WHERE rownum BETWEEN foo AND bar]
声明。
内部選択は、1秒未満で最大13,000行を返します(個別に実行)。返される列の1つはSUM()
、結合されたテーブルからのものです。
外側の選択は、500〜1000の範囲の内側の選択値を返すのに約14秒かかります。ただし、返されたSUMをコメントアウトすると、1秒未満かかります。これは私が期待することです。
私の質問は、外部クエリでそのSUMを返すという行為だけでなぜそんなに時間がかかるのかということです。
以下の例
完全なクエリの例(〜14秒):
SELECT yadayada, number
FROM (SELECT yadayada, SUM(innerNum) AS number,
ROW_NUMBER() OVER (ORDER BY yadayada DESC) AS rownum
FROM table1
JOIN table2 ON table1.id = table2.id
GROUP BY yadayada)
WHERE rownum BETWEEN 500 AND 1000
内部クエリの例(<1秒):
SELECT yadayada, SUM(innerNum) AS number,
ROW_NUMBER() OVER (ORDER BY yadayada DESC) AS rownum
FROM table1
JOIN table2 ON table1.id = table2.id
GROUP BY yadayada
SUMを返さない完全なクエリの例(<1秒):
SELECT yadayada --, number (commented out, still returned in inner query)
FROM (SELECT yadayada, SUM(innerNum) AS number,
ROW_NUMBER() OVER (ORDER BY yadayada DESC) AS rownum
FROM table1
JOIN table2 ON table1.id = table2.id
GROUP BY yadayada)
WHERE rownum BETWEEN 500 AND 1000