我有一个大约有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 column
,还是Included Columns
只有一个和其他人?
答案 0 :(得分:0)
第一个查询使用以下列:ProductId
,ManufacturerId
和ModifiedOn
。
由于日期不平等,索引可用于优化where
子句,但不能优化order by
。但是,通过在索引中包含ProductId
,引擎可以使用以下索引满足整个查询:LiveProducts(ManufacturerId, ModifiedOn, ProductId
)。请注意,这些列的排序很重要。而且,查询仍需要对order by
进行排序。
第二个查询是选择所有列,因此需要转到原始数据。因此,优化仅适用于where
子句。为此,请使用LiveProducts(ManufacturerId, ProductId)
。在这种情况下,它应该能够使用索引进行排序。