3

这个查询是从一个非常长的动态后续存储过程生成的——该过程返回从给定索引开始的请求记录数,以显示在 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

谢谢你的帮助!

4

2 回答 2

4

对于较高的行数,分页ROW_NUMBER确实效率很低。

有时最好将其拆分一下并ROW_NUMBER在窄索引上进行查询以检索匹配的 PK,并将连接返回到基表以检索丢失的列。

于 2012-11-02T20:04:52.127 回答
1

SQL 2012 有更高效的分页机制

http://stevestedman.com/2012/04/tsql-2012-offset-and-fetch/

SELECT DepartmentID, Revenue, Year FEVENUE ORDER BY Year, DepartmentID ASC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

于 2012-11-02T21:04:42.380 回答