2011-09-15 18 views
10

私はデータのページを返すと、以下のように見える1つのストアドプロシージャ内のすべてのデータのカウントを行しようとしています:CTE、ROW_NUMBERとROWCOUNT

WITH Props AS 
(
    SELECT *, 
    ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber 
    FROM Property 
    WHERE PropertyType = @PropertyType AND ... 
) 

SELECT * FROM Props 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize); 

は、私は(行数を返すことができません最も高い行番号)。

私は、これはすでに議論されている(私はこれを見てきました: Efficient way of getting @@rowcount from a query using row_numberを)知っているが、私はCTEの性能が低下してCOUNT(x)はOVER(1 BY PARTITION)を追加し、その上でクエリが正常にかかるとき永遠に実行に時間がかかることはありません。カウントは各行ごとに計算されているので、私はそれを考えていますか?私は別のクエリでCTEを再利用することはできないようです。テーブルの小道具は100kレコード、CTEは5kレコードを返します。

+1

は、SQL Serverの問題として再タグ付けすべき照会しています。私はあなたのためにそれをやっただろうが、あなたは5つのタグしか許されていない。あなたが取り除きたいと思うものは分からなかった。 –

答えて

15

それは今あなたがすべての行にCNTを持っている...それとも、別の何かをしたかった

;WITH Props AS 
(
    SELECT *, 
     ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber 
    FROM Property 
    WHERE PropertyType = @PropertyType AND ... 
) 

, Props2 AS 
(
    SELECT COUNT(*) CNT FROM Props 
) 

-- Now you can use even Props2.CNT 
SELECT * FROM Props, Props2 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize); 

すべきですか?カウントだけで2番目の結果セットが必要でしたか?じゃやれ!

-- This could be the second result-set of your query. 
SELECT COUNT(*) CNT 
FROM Property 
WHERE PropertyType = @PropertyType AND ... 

注:再編集、1ダビデが今参照したクエリがtrashcannedされた、クエリ2は現在、1

+0

1. group by節を持っていなければならないので動作しません。2.完全に動作し、私はそれが一番好きです。ありがとうございました。 – David

+0

私のバージョンでは、最初のcteにCOUNT(1)が追加されており、ワークテーブルで800000の読み込みが行われました。 2番目のcteを使用すると(ここでやったように)、すべての読み込みがスキップされ、驚くほど高速なクエリが得られます。 –

1

結果セット全体のカウントが必要ですか?

これは速く動作しますか? T-SQLで

SELECT *,(select MAX(RowNumber) from Props) as MaxRow 
FROM Props 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 
    AND (@PageNumber * @PageSize); 
+0

はcca 10%linearyを追加しました。 はまだもう1つの答えを試してみます.. – David