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.
这就是我所做的(无论我返回哪条记录,它都一样快):
--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)
| 归档时间: |
|
| 查看次数: |
5459 次 |
| 最近记录: |