0

私は毎日このサイトにアクセスしていますが、これまで投稿したことはありません。クエリに時間がかかる理由を理解するのに苦労しています。

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
4

2 に答える 2

1

問題を説明するかもしれない2つの推測を危険にさらします。

まず、内部サブクエリを測定する場合、最初の行が表示されるまでの時間を測定しますか、それとも結果セット全体が表示されるまでの時間を測定しますか?私の推測では、あなたは最初の行を見ていると思います。

私の2番目の推測は、yadayadaとidにインデックスがあるということです。これは、サブクエリはすべてインデックスのみを使用して満たすことができることを意味します。追加の列innerNumを含めると、クエリエンジンは実際にはテーブルの1つからページを読み取る必要があります。

したがって、クエリ全体のオーバーヘッドは2つの組み合わせです。

  • 完全な結果セットを返す必要性
  • 元のテーブルのページにアクセスする必要性

私は完全にオフになっているかもしれませんが、これはあなたに問題を引き起こしている可能性があるものについてのいくつかのアイデアを与えるかもしれません。

于 2012-08-17T14:18:54.350 に答える
0
Just try this:

;WITH CTE as 
(
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
)

select yadayada, number from CTE where rownum between 500 and 1000
于 2012-08-17T14:12:58.597 に答える