【发布时间】:2012-11-02 20:00:07
【问题描述】:
这个查询是从一个非常长的动态后续存储过程生成的——该过程返回从给定索引开始的请求记录数,以显示在 Telerik Radgrid 中,有效地处理分页。存储过程输出的简化版本:
SELECT r.* FROM (
SELECT ROW_NUMBER() OVER(ORDER BY InventoryId DESC) as row,
v.* FROM vInventorySearch v
) as R WHERE [ROW] BETWEEN 1 AND 10
当“BETWEEN”子句介于 1 和 10 之间时,它会在几分之一秒内运行,但如果它介于 10000 和 1010 之间,则几乎需要整整一分钟才能执行。
我觉得我可能在这里遗漏了一些基本的东西,但在我看来,我检索哪 10 条记录并不重要,它应该花费相同的时间。
感谢您的任何意见,我期待着尴尬!
解决方案,由 Martin Smith(下)提供:
SELECT r.*, inv.* FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY InventoryId DESC) as row, v.InventoryID
FROM vInventorySearch v
WHERE 1=1
) as R
inner join vInventory inv on r.InventoryID = inv.InventoryID
WHERE [ROW] BETWEEN 10001 AND 10010
感谢您的帮助!
【问题讨论】:
-
你能发布你的表定义,包括索引和执行计划吗?
标签: sql performance stored-procedures