2017-06-08 5 views
0

Ich verwende MS SQL und habe zwei Tabellen: Produkte (ProdID, einige andere Felder) und ProdCat (ID, ProdID, CategoryID), die bestimmen, welches Produkt zu welcher Kategorie gehört.Index zur Beschleunigung der Abfrage mit innerem Join erstellen

Und ich mache wählen wie

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 

Produkte Tisch verfügt über mehr als 50.000 und ProdCat Tabelle hat mehr als 150.000 Datensätze und die Abfrage ist langsam.

Können Sie bitte beraten, wie Index erstellt wird, um diese Abfrage zu beschleunigen?

Danke.

+0

Hallo und willkommen bei SO. Niemand kann hier einen Index anbieten, da uns die Details Ihrer Tabellen nicht helfen können. Können Sie das ddl für die Tabellen und die vorhandenen Indizes bereitstellen? Es kann sein, dass ein Index nicht wirklich das Problem ist, aber ohne diese Details können wir nicht viel tun. –

+0

Sie sollten den tatsächlichen Ausführungsplan für die Abfrage buchen. Sie können dies leicht von SSMS erhalten. – Igor

+0

Schauen Sie sich den Plan an und sehen Sie, wo das Problem liegt. Ich kann mir mehrere Indizes vorstellen, die diese spezifische Abfrage optimieren würden, aber sie wären ziemlich spezifisch für diese Abfrage und nicht generell nützlich ... aber ich kann nicht sicher wissen, ohne Tabellenschemas, einen Plan zu sehen und mehr über das zu wissen Daten. – pmbAustin

Antwort

0

Das ist Ihre Abfrage:

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; 

Dies ist ein bisschen schwierig ist, weil es gibt zwei Möglichkeiten, die Abfrage optimiert werden könnte. Versuchen Sie zuerst ProdCat(CategoryId, ProdId) und Products(ProdId, Active).

Leider werden beide nicht die Bestellung zu beseitigen. Dies könnte jedoch die Leistung verbessern.

0

ProdCat (ID, ProdID, CategoryID)

Warum gibt es eine ID-Spalte? Das scheint nicht hilfreich zu sein.

In einer solchen Viele-zu-Viele-Verknüpfungstabelle müssen Sie effizient alle CategoryIDs für eine einzelne ProdID abrufen und die gesamte ProdID für eine einzelne Kategorie abrufen können.

Ihre Abfrage ist ein Fall-in-Punkt warum. Wenn Products.Active eine geringe Kardinalität aufweist, kann die Abfrage dort beginnen und die Kategorien für jedes aktive Produkt nachschlagen, oder es kann mit Kategorie = 123 beginnen und dann alle Produkte finden.

Dann sollte diese Tabelle eine Cluster-PK auf (ProdID, CategoryID) und einen nicht gruppierten Index auf (CategoryID) (oder umgekehrt) haben.

Verwandte Themen