我的工作从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