【问题标题】:Create index to speed up query with inner join使用内连接创建索引以加快查询速度
【发布时间】:2017-06-08 19:28:50
【问题描述】:

我正在使用 MS SQL 并且有两个表:Products(ProdID、其他一些字段)和 ProdCat(ID、ProdID、CategoryID),它们确定了哪个 Product 属于哪个类别。

我正在做选择

SELECT TOP (8) ProdID, Description, Image
FROM  Products INNER JOIN ProdCat ON ProdCat.ProdID = Products.ProdID
WHERE  Products.Active=1 AND ProdCat.CategoryID = 123 Order by ProdCat.sorting, Products.ProdID

Products 表超过 50000 条,ProdCat 表超过 150000 条记录,查询速度很慢。

您能否建议如何创建索引以加快此查询?

谢谢。

【问题讨论】:

  • 您好,欢迎来到 SO。没有人可以在这里提供索引,因为我们缺乏您的表格的详细信息来提供帮助。你能提供表和现有索引的 ddl 吗?可能索引并不是真正的问题,但如果没有这些细节,我们将无能为力。
  • 您应该发布查询的实际执行计划。您可以从 SSMS 轻松获取此信息。
  • 看计划,看看问题出在哪里。我可以想象有几个索引可以优化那个特定的查询,但是它们对于那个查询来说是非常具体的,而且通常没有用......但是如果没有看到表模式、计划和了解更多关于数据。

标签: sql sql-server performance


【解决方案1】:

这是您的查询:

SELECT TOP (8) ProdID, Description, Image
FROM Products p INNER JOIN
     ProdCat pc
     ON pc.ProdID = p.ProdID
WHERE  p.Active = 1 AND pc.CategoryID = 123
Order by pc.sorting, p.ProdID;

这有点挑战性,因为可以通过两种方式优化查询。首先尝试ProdCat(CategoryId, ProdId)Products(ProdId, Active)

不幸的是,两者都不会消除排序。但这可能会提高性能。

【讨论】:

    【解决方案2】:

    ProdCat(ID、ProdID、CategoryID)

    为什么会有 ID 列?这似乎没有帮助。

    在这样的多对多链接表中,您需要能够有效地获取单个 ProdID 的所有 CategoryID,并获取单个 Category 的所有 ProdID。

    您的查询是为什么的一个案例。如果 Products.Active 具有低基数,则查询可能从那里开始,并查找每个 Active 产品的类别,或者它可能从 Category=123 开始,然后查找所有产品。

    那么这个表应该在 (ProdID,CategoryID) 上有一个聚簇 PK,在 (CategoryID) 上有一个非聚簇索引(反之亦然)。

    【讨论】:

      猜你喜欢
      • 2012-05-24
      • 2021-04-29
      • 2013-08-28
      • 2023-01-05
      • 2011-11-16
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      相关资源
      最近更新 更多