Wenn du
Verbundschlüssel verwendest, dann musst du bei JOINS dafür sorgen, dass in der
ON-Klausel
alle Felder (oder zumindest Felder von links) des Verbundschlüssels angesprochen werden.
Angenommen eine Tabelle habe einen Verbundschlüssel mit den Feldern A,B und C.
Es gibt nun "abgedeckte" und "nicht-abgedeckte" Abfragen.
Abgedeckte Abfragen benützen den Index; nicht abgedeckte Abfragen können den Index nicht benützen.
Abgedeckt wäre:
SQL-Code:
SELECT * FROM Tabelle WHERE A=1 AND B=2 AND C=0
SELECT * FROM Tabelle WHERE A=1 AND B=2
SELECT * FROM Tabelle WHERE A=1
Nicht abgedeckt wäre z.B.
SQL-Code:
SELECT * FROM Tabelle WHERE AND B=2 AND C=0
SELECT * FROM Tabelle WHERE A=1 AND C=5
SELECT * FROM Tabelle WHERE B=8
Dies trifft in genau gleicher Weise für JOINs zu.
Würdest du z.B.
für Table Transaktion ist der Primary Key ein Verbundschlüssel("SORT_ID", "ID").
für Table TransaktionDetails ist der Primary Key ein Verbund("SORT_ID", "TRANSAKTION_ID", "ID")
wählen und dann beim JOIN schreiben:
SQL-Code:
SELECT ARTIKEL_NR, Sum(ANZAHL) AS ANZ, Sum(PREIS * ANZAHL) as GPreis
FROM TRANSAKTION T INNER JOIN TRANSAKTIONDETAILS TD ON(T.SORT_ID=TD.SORT_ID AND T.ID = TD.TRANSAKTION_ID)
dann könnte der JOIN effizient über den Primärschlüsselindex erfolgen.
Das ist aber erst die halbe Miete.
Auch das Feld T.ENDE_DT sollte indiziert sein.
Die Ergebnismenge ist nun soweit reduziert, dass ein Index auf T.BON_TYP keine Verbesserung mehr bringt.