SQL Server 分页查询 - 性能考虑

问题描述 投票:0回答:2

我正在研究 SQL,但在性能方面的技术不太好。我正在使用 C# 动态形成查询,并在我的脑海中实现分页目的

每次分页时单击我都会获取 10 条记录和我的示例查询,如下所示

Select * 
from (Select ROW_NUMBER() OVER (ORDER BY TestId)[RowNumber],TestId...........) as paging  
Where RowNumber BETWEEN 10 AND 20

其中 testId 是主键。

效果非常好。我发布了语法,因为它是机密数据。 它在 6 秒内执行

如果用户单击最后一页,则会形成以下查询

Select * 
from (Select ROW_NUMBER() OVER (ORDER BY TestId)[RowNumber],TestId...........) as paging  
Where RowNumber BETWEEN 30000 AND 30010

上述查询需要 40 秒。

我缺少的核心是什么

每次我得到10条记录,但时间差异巨大

谢谢

sql sql-server sqlperformance
2个回答
0
投票

恐怕这个问题没有办法解决。使用每种方法,您都必须以某种方式计算每一行的数字,并且您可以在某些临时表/索引视图中预先计算它们,或者让 sql server 即时执行此操作(您当前的解决方案)。

如果您想提高当前查询的性能,请在包含列的 TestId(即使它已经是 PK)上添加索引(您必须包括将返回的所有列)。

create index idxI__testid on <yourtable> (TestId) include (<column1>,<column2>)

但只有当您只想返回其中的几列时,这才有意义。


0
投票

1)testid需要建立索引。按照建议创建索引时使用 INCLUDE(要返回的列)。

2)尝试使用选择TOP。例如:

Select * from (Select TOP 20 ROW_NUMBER() OVER (ORDER BY TestId)[RowNumber],TestId...........) 
as paging  
Where RowNumber BETWEEN 10 AND 20
© www.soinside.com 2019 - 2024. All rights reserved.