获取记录子集以及总记录数

Dan*_*ort 6 sql-server sql-server-2008

我正在努力从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
Run Code Online (Sandbox Code Playgroud)

当我在匹配的低端返回项目时,这个查询工作得非常快,比如记录1到15.但是,当我开始返回记录1000 - 1015时,处理将从不到15秒到超过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
Run Code Online (Sandbox Code Playgroud)

该查询在2-3秒内运行高数字返回,但也在2-3秒内运行低数字查询.因为它为70,000多行中的每一行进行计数,所以它使得每个请求都需要更长的时间,而不仅仅是大的行数.

因此,我需要弄清楚如何获得良好的行数,以及只返回结果集中任何一点的项目子集,而不会遭受如此巨大的惩罚.我可以处理高排数的2-3秒罚款,但是15太多了,而且我不愿意在一个人看到的前几页上遭受缓慢的负荷.

注意:我知道在第二个例子中我不需要CTE,但这只是一个简单的例子.在生产中,在我将其过滤到我需要的15行之后,我正在进一步加入tempTable.

Gab*_*ams 8

这就是我所做的(无论我返回哪条记录,它都一样快):

--Parameters include:
@pageNum int = 1,
@pageSize int = 0,



DECLARE 
    @pageStart int,
    @pageEnd int

SELECT
    @pageStart = @pageSize * @pageNum - (@pageSize - 1),
    @pageEnd = @pageSize * @pageNum;


SET NOCOUNT ON;
WITH tempTable AS (
    SELECT
        ROW_NUMBER() OVER (ORDER BY FirstName ASC) AS RowNumber,
        FirstName
        , LastName
    FROM People
    WHERE Active = 1
)

SELECT
    (SELECT COUNT(*) FROM tempTable) AS TotalRows,
    *
FROM tempTable
WHERE @pageEnd = 0
OR RowNumber BETWEEN @pageStart AND @pageEnd
ORDER BY RowNumber
Run Code Online (Sandbox Code Playgroud)