我正在使用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条记录,查询速度慢。
您能否建议如何创建索引以加快此查询?
感谢。
答案 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)上的非聚集索引(反之亦然)。