我的工作從SQL Server 2008中返回的記錄做一些分頁。我一次只能返回15條記錄,但我需要將記錄的總數與記錄的子集一起。我使用了兩個不同的查詢,結果混合,這取決於我需要將子集拉到哪個較大的組中。這裏有一個例子:獲取記錄與總記錄沿子集數
SET NOCOUNT ON;
WITH tempTable AS (
SELECT
FirstName
, LastName
, ROW_NUMBER() OVER(ORDER BY FirstName ASC) AS RowNumber
FROM People
WHERE
Active = 1
)
SELECT
tempTable.*
, (SELECT Max(RowNumber) FROM tempTable) AS Records
FROM tempTable
WHERE
RowNumber >= 1
AND RowNumber <= 15
ORDER BY
FirstName
此查詢的工作真的快,當我到15就返回匹配的低端項目,記錄等[1]然而,當我開始返回記錄1000年至1015年,該處理將從一秒以下超過15秒。
所以我改變了查詢,而不是以下:
SET NOCOUNT ON;
WITH tempTable AS (
SELECT * FROM (
SELECT
FirstName
, LastName
, ROW_NUMBER() OVER(ORDER BY FirstName ASC) AS RowNumber
, COUNT(*) OVER(PARTITION BY NULL) AS Records
FROM People
WHERE
Active = 1
) derived
WHERE RowNumber >= 1 AND RowNumber <= 15
)
SELECT
tempTable.*
FROM tempTable
ORDER BY
FirstName
該查詢運行高數在2-3秒內返回,但也運行在2-3秒的低數量的查詢,以及。因爲它做的次數爲每20000行,它使每要求需要更長的時間,而不是僅僅是大排數字。
所以我需要弄清楚如何獲得良好的行數,以及只在結果的任何點返回項目的子集而不遭受如此巨大的損失。我能勝任2-3秒的處罰爲高行號,但15實在是太多了,我不願意吃虧的前幾頁一個人的觀點慢負荷。
注意:我知道我不需要在第二個例子中的CTE,但這只是一個簡單的例子。在製作過程中,我將tempTable過濾到我需要的15行後進行了更多連接。
參見[這](http://www.sqlservercentral.com/articles/paging/70120 /)。 – 2011-09-08 20:50:25