我正在研究 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 server 即时执行此操作(您当前的解决方案)。
如果您想提高当前查询的性能,请在包含列的 TestId(即使它已经是 PK)上添加索引(您必须包括将返回的所有列)。
create index idxI__testid on <yourtable> (TestId) include (<column1>,<column2>)
但只有当您只想返回其中的几列时,这才有意义。
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