【问题标题】:best way to setup an index for this particular query?为这个特定查询设置索引的最佳方法?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 所以我需要创建 2 个索引?
  • @Slee 。 . .好吧,对于两个查询的最佳索引,您确实需要两个索引。根据哪个查询需要更多性能改进,您可能会选择只有一个。
猜你喜欢
  • 1970-01-01
  • 2016-06-28
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多