Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#5

AW: Index geschickt setzen für Tabellenvergleich

  Alt 24. Mär 2021, 17:10
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

Geändert von Delphi.Narium (24. Mär 2021 um 17:27 Uhr) Grund: Fehler behoben
  Mit Zitat antworten Zitat