2011-09-15 21 views
10

Bir saklı yordam bir veri sayfasını dönmek ve aynı zamanda tüm verilerin sayısını kürek çalışıyorum hangi aşağıdaki gibidir:CTE, ROW_NUMBER ve 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); 

I (satır sayısını döndürmek alamıyorum en yüksek satır sayısı). Bu zaten tartışıldı biliyorum

(bunu görmüştüm: Efficient way of getting @@rowcount from a query using row_number) ama CTE performans düşer içinde COUNT (x) AŞIRI (1 TARAFINDAN BÖLME) ekleyip zaman yukarıda sorgu normalde alır sonsuza kadar sürecek bir zaman almaz. Sanırım sayım her satır için hesaplanıyor? Görünüşe göre CTE'yi başka bir sorguda tekrar kullanamıyorum. Tablo Sahne 100k kayıtları vardır, CTE 5k kayıtları verir.

+1

bir SQL Server soru olarak yeniden etiketleme mı şimdi. Bunu sizin için yapardım, ancak yalnızca 5 etikete izin verdiniz ve hangisini kaldırmak istediğinizi bilmiyordum. –

cevap

15

Eğer her satırda CNT var ... Ya da farklı bir şey istedi şimdi

;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); 

olmalıdır? Sadece sayımla ikinci bir sonuç istedin mi? O zaman yap!

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

Not: Sorgu 1 David şimdi trashcanned edilmiştir referanslanmasına edildi reedited, sorgu 2 sorgusu 1.

+0

1. işe yaramaz çünkü bir gruba yan tümce sahip olmanız gerekir. 2. mükemmel çalışıyor ve en çok beğendim. Teşekkür ederim. – David

+0

Benim versiyonumda, ilk cte'da COUNT (1) eklenmişti ve bu da çalışma masasında 800000 okumaya neden oldu. İkinci bir cte kullanmak (burada yaptığınız gibi), tüm bu okumaları blazingly hızlı bir sorguyla sonuçlandırarak atladı. –

1

Sonuç kümesinin tam sayısını istiyor musunuz?

bu işlem hızda çalışıyor mu? 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 doğrusallık ekler, bu harika! şimdi diğer yanıtı deneyecek .. – David