2017-06-08 37 views
0

我正在使用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

嗨,歡迎來到SO。沒有人可以在這裏提供索引,因爲我們缺乏能夠提供幫助的表格的細節。你能爲表格和現有索引提供ddl嗎?這可能是一個索引不是真正的問題,但沒有這些細節我們不能做太多。 –

+0

您應該發佈查詢的實際執行計劃。你可以很容易地從SSMS得到這個。 – Igor

+0

看看這個計劃,看看問題出在哪裏。我可以想象一些可以優化特定查詢的索引,但它們對於該查詢非常具體,並且通常不是很有用......但是我無法確切地知道沒有查看錶格模式,計劃以及瞭解更多關於數據。 – pmbAustin

回答

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)

不幸的是,既不排除排序。但是這可能會提高性能。

0

ProdCat(ID,的ProdID,類別ID)

爲什麼有一個ID列?這似乎沒有幫助。

在這樣的多對多鏈接表中,您需要能夠高效地獲取單個ProdID的所有CategoryID,並獲取單個Category的所有ProdID。

您的查詢是一個案例的原因。如果Products.Active具有較低的基數,則查詢可能從那裏開始,並查找每個活動產品的類別,或者可能以Category = 123開頭,然後查找所有產品。

然後,此表應該在(ProdID,CategoryID)上有一個聚集PK,並且(CategoryID)上有一個非聚簇索引(反之亦然)。