Unter FireBird bringt sowas sehr viel:
SQL-Code:
create index ix_gestern on Gestern (FirmenNummer, Abteilungsnummer, PersonenNummer, Kennzeichen, Tag, Dauer);
create index ix_heute on Heute (FirmenNummer, Abteilungsnummer, PersonenNummer, Kennzeichen, Tag, Dauer);
Wobei:
SQL-Code:
Left Join Gestern
On Heute.FirmenNummer = Gestern.FirmenNummer
...
Where
Gestern.FirmenNummer is NULL
finde ich befremdlich. Null ist jetzt nicht zwingend ein Wert, dessen Abfrage man über 'nen Index besonders gut beschleunigen kann.
Was genau hast Du vor?
Left Join liefert ja alles von heute, auch wenn es das nicht konkret so gestern gab. Bei denen ist die FirmenNummer dann Null. Vermute mal, dass Du genau diese "Dinger" haben willst.
Würde das eher auf zwei Schritte aufteilen:
SQL-Code:
Select
FirmenNummer,
Abteilungsnummer,
PersonenNummer,
Kennzeichen,
Tag,
Dauer,
FirmenNummer_2
from (
Select
Heute.FirmenNummer,
Heute.Abteilungsnummer,
Heute.PersonenNummer,
Heute.Kennzeichen,
Heute.Tag,
Heute.Dauer,
Gestern.FirmenNummer as FirmenNummer_2
From Heute
Left Join Gestern
On Heute.FirmenNummer = Gestern.FirmenNummer
And Heute.Abteilungsnummer = Gestern.Abteilungsnummer
And Heute.PersonenNummer = Gestern.PersonenNummer
And Heute.Kennzeichen = Gestern.Kennzeichen
And Heute.Tag = Gestern.Tag
And Heute.Dauer = Gestern.Dauer
)
Where
FirmenNummer_2 is NULL
Meine (zugegeben etwas flache) Indexregel ist: Alles was im Where steht, kommt in den Index.
Hilft meist, aber nicht immer und es kommt ggfls. auf die Datenbank an.
Was immer hilft: Ausführungsplan anschauen. Steht da was von Fulltablescan, ist's eher übel. Je mehr aus der Where-Bedingung dort aufgeführt wird, um so größer ist die Wahrscheinlichkeit, dass 'ne Abfrage schnell wird.
Natürlich kann man jetzt in 'ner Datenbank nicht grundsätzlich für jede potentiell mögliche Wherebedingung nach dieser Regel 'nen Index erstellen. Wenn Du für den Vergleich aber eine eigenen Datenbank zu Verfügung hast, so spricht nix dagegen, es mit 'nem Index nach dieser Regel zu versuchen. Aber: Je komplexer ein Index, um so langsamer wird das Befüllen, da der Index dabei ja mit aufgebaut werden muss.
Es könnte sich von daher als sinnvoll erweisen, zuerst den Index zu löschen, dann (wenn erforderlich) die Tabelle leeren, dann die Tabelle neu befüllen, dann den Index neu erstellen.
Kommt auf die Datenmenge, die Datenbank, die darunterliegende Hardware an. Manchmal hilft da eher "Probieren geht über Studieren" als sinnvolles, lehrbuchmäßiges Vorgehen