Frank (no reg): (SQL) Abfrage optimieren (und weiter gehts...)

Beitrag lesen

Okay, beispiel

Tabelle Price   (Fund, Investable, AsOfDate, Price)
Tabelle Investable   (Id, Fund, Name, AsOfDate)
Zwischen Price.Fund und Investable.Fund sowie Price.Investable und Investable.Id gibt es ForeignKey-Beziehungen

Wenn du jetzt folgende Abfrage nimmst

SELECT Fund, Investable, Name, AsOfDate, Price
FROM Investable
INNER JOIN Price
   ON Fund = Fund
   AND Investable = Id

... bekommst du mindestens 3 Meldungen "ambigious use of column name" o.s.ä.  weil die Spalten in beiden Tabellen gleich heissen, nicht? Aus welcher Tabelle soll denn AsOfDate nun genommen werden?

Um das zu umgehen müsstest du schreiben

SELECT Investable.Fund, Price.Investable, Investable.Name, Price.AsOfDate, Price
FROM Investable
INNER JOIN Price
   ON Price.Fund = Investable.Fund
   AND Price.Investable = Investable.Id

Und jetzt stell dir vor, du hast n langen komplizierten Namen für die Tabelle ... sowas wie PrzybilskiUndIvanovichMonsterTabelle, willst du das jedes mal tippen oder C&P'en? Dann wird dein Code ziemlich unleserlich.

Stattdessen würdest zu einfach Aliase p und i verwenden ... lassen sich einfacer merken und machen es damit übersichtlicher.

SELECT I.Fund, P.Investable, I.Name, P.AsOfDate, Price
FROM Investable I
INNER JOIN Price P
   ON P.Fund = I.Fund
   AND P.Investable = I.Id

Soweit verstanden. Performancemässig hat das sogut wie 0 Einfluss.

Wie hast du dir denn den Ausführungsplan anzeigen lassen? Als "estimated" oder den wirklichen bei der Ausführung? "Estimated" heisst estimated, weils ne ungefähre Schätzung vom Server ist, der Actual Execution Plan sollte dir dann schon Unterschiede zeigen.

Oder anders, wenn du nur 5 Spalten von den insgesamt 200 in der Tabelle brauchst, brauchen auch nur 5 gelesen werden = weniger Daten = weniger Daten im Ram usw.

Ciao, Frank