我使用MS,有两个表: Products (ProdID,其他一些字段)和ProdCat (ID,ProdID,CategoryID),它确定哪个产品属于哪个类别。
我让select喜欢
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.ProdIDProducts表有50.000多条记录,ProdCat表有150.000多条记录,查询速度慢。
你能告诉我如何创建索引来加速这个查询吗?
谢谢。
发布于 2017-06-09 03:38:11
这是您的查询:
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)。
不幸的是,这两种方法都不会消除排序。但这可能会提高性能。
发布于 2017-06-09 04:17:23
ProdCat (ID,ProdID,CategoryID)
为什么会有ID列?这似乎没有什么帮助。
在这样的多对多链接表中,您需要能够有效地获取单个ProdID的所有CategoryID,并获取单个Category的所有ProdID。
你的问题就是一个很好的例子。如果Products.Active的基数较低,则查询可能从那里开始,查找每个活动产品的类别,或者从Category=123开始,然后查找所有产品。
那么这个表应该在(ProdID,CategoryID)上有一个聚集PK,在(CategoryID)上有一个非聚集索引(反之亦然)。
https://stackoverflow.com/questions/44444084
复制相似问题