使用内部联接创建索引以加速查询

时间:2017-06-08 19:28:50

标签: sql sql-server performance

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

我正在选择

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

产品表有超过50.000,ProdCat表有超过150.000条记录,查询速度慢。

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

感谢。

2 个答案:

答案 0 :(得分:0)

这是您的查询:

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)

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

答案 1 :(得分:0)

  

ProdCat(ID,ProdID,CategoryID)

为什么有ID列?这似乎没有用。

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

您的查询是原因的一个例子。如果Products.Active的基数较低,则查询可以从那里开始,查找每个Active产品的类别,或者可以从Category = 123开始,然后找到所有产品。

然后,此表应具有(ProdID,CategoryID)上的聚簇PK和(CategoryID)上的非聚集索引(反之亦然)。