Die Frage ist, was Sie optimieren möchten .. Lesbarkeit (und Wartbarkeit) und/oder Leistung?
Die meisten Leute haben ihren eigenen "Stil" beim Schreiben von Abfragen. Ich bevorzuge das untenstehende, aber auf dem Server wird es wahrscheinlich gleich aussehen und höchstwahrscheinlich wird das System genau die gleiche Menge an "Arbeit" haben, um die Daten zu bekommen, auch wenn es für uns Menschen anders aussieht. Ich würde vorschlagen, ein wenig herum zu googeln und zu lernen, wie man einen Abfrageplan interpretiert.
SELECT q2.CounterID,
tt1.Text as OutletTitle,
tt2.Text as CounterTitle
FROM Outlets as q1
INNER JOIN Counters as q2
ON q2.OutletID = q1.OutletID
INNER JOIN TranslationTexts as tt1
ON tt1.TranslationID = q1.TitleID
AND tt1.Locale = 'ar-SA'
INNER JOIN TranslationTexts as tt2
ON tt2.TranslationID = q2.TitleID
AND tt2.Locale = 'ar-SA'
WHERE q1.CompanyID = 311
AND q1.OutletID = 8
Auf der Dinge, die ich bemerken ist, dass Sie sowohl CompanyID
und OutletID
als Filter für die Outlets
Tabelle übergeben. Da OutletID
der Primärschlüssel dieser Tabelle ist, frage ich mich, ob Sie wirklich den Filter auf CompanyID
benötigen. Im besten Fall wird es die Aufzeichnung beseitigen, weil es die falsche Firma ist, aber irgendwie habe ich den Eindruck, dass Sie bereits die richtige CompanyID
kennen.
Was die Leistung, würde ich diese Indizes beraten
CREATE INDEX idx_Locale ON TranslationTexts (Locale, Translation_id)
CREATE INDEX idx_CompanyID ON Outlets (CompanyID) INCLUDE (TitleID, OutletID)
Höchstwahrscheinlich werden Sie auch diesen Index auf Local
ein UNIQUE
Index machen es noch besser zu machen arbeiten.
Wenn Sie Ihre Frage so bearbeiten, dass sie Beispieldaten und gewünschte Ergebnisse enthält, können andere besser verstehen, was mit Ihrer Abfrage geschehen soll. –
Wenn tt.Locale einen kleinen Bereich von Werten hat, können Sie dafür eine Dictionary-Tabelle erstellen und den Fremdschlüssel in einer Where-Klausel verwenden - die Suche über Varchar-Daten ist langsam. Außerdem haben Sie ziemlich ähnliche where-Klauseln in Ihren beiden Unterabfragen - denken Sie, wenn Sie es in die äußere Abfrage verschieben können, um die gleiche Operation nicht zweimal auszuführen. – PacoDePaco