【发布时间】:2013-07-05 14:38:05
【问题描述】:
我有一个大约有 200 万行的数据库,我需要修复当前的分页,并决定采用以下方法:
SET @startRowIndex = ((@Page-1) * @PageSize) + 1;
SET ROWCOUNT @startRowIndex
SELECT @first_id = ProductID FROM LiveProducts (nolock) WHERE ManufacturerID=@ManufacturerID AND ModifiedOn >= @tStamp ORDER BY ProductID
SET ROWCOUNT @PageSize
SELECT * FROM LiveProducts (nolock) WHERE ManufacturerID=@ManufacturerID AND ProductID >= @first_id ORDER BY ProductID
我离 DBA 还差得很远,我希望这个过程尽可能快。我应该在这件事上设置什么索引。根据我的阅读和我收集到的基本理解,我应该在 ManufacturerID、ProductID 和 ModifiedOn 上创建一个非聚集索引。
但他们应该都是Index key columns,还是只有一个在Included Columns?
【问题讨论】:
-
你的分页逻辑没有意义。如果查询返回 >1 行,第一个查询甚至不会像书面 b/c 那样工作,您不能进行标量赋值。您可能想说“@first_id”= MAX(ProductID)。您的第二个查询具有与第一个查询不同的 WHERE 子句。您至少需要在第二个查询中包含 ModifiedOn >= "@tStamp" 以获得一致的分页。
标签: sql sql-server indexing