为此特定查询设置索引的最佳方法?

时间:2013-07-05 14:38:05

标签: sql sql-server indexing

我有一个大约有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只有一个和其他人?

1 个答案:

答案 0 :(得分:0)

第一个查询使用以下列:ProductIdManufacturerIdModifiedOn

由于日期不平等,索引可用于优化where子句,但不能优化order by。但是,通过在索引中包含ProductId,引擎可以使用以下索引满足整个查询:LiveProducts(ManufacturerId, ModifiedOn, ProductId)。请注意,这些列的排序很重要。而且,查询仍需要对order by进行排序。

第二个查询是选择所有列,因此需要转到原始数据。因此,优化仅适用于where子句。为此,请使用LiveProducts(ManufacturerId, ProductId)。在这种情况下,它应该能够使用索引进行排序。