![]() |
Datenbank: Firebird • Version: V2.5 • Zugriff über: IBX
SQL optimieren
Hallo Leute könnt Ihr mir mal bitte helfen einen SQL zu optimieren
Es handelt sich um zwei Tabelle. Tabelle1 hat weniger Datensätze als Tabelle 2 Ich möchte am Ende alle Datensätze der Tabell1 haben bei denen kein Datensatz in der Tabelle2 existiert (zu den beiden Bedingungne) und dann noch das Ergebnis etwas eingrenzen durch die beiden Bedingungen auf Tabelle 1. Auf den Feldern liegt überall ein Index. Das ganze läuft ca. 10 Minuten da in der Tabelle 2 wirklich viele Datensätze liegt.
Delphi-Quellcode:
Select Tabelle1.HauptNummer
from Tabell1 Left Outer Join Tabelle2 on Tabell1.ergaenzung = Tabelle2.ergaenzung and Tabell1.HauptNummer = Tabelle2.HauptNummer where Tabelle2.ergaenzung is null and Tabell1.ergaenzung <> 'N' and Tabell1.Storno is Null Danke Tanja |
AW: SQL optimieren
Weiß nicht, ob FireBird sowas kann:
SQL-Code:
(Syntaktisch müsste es gehen, habe das gerade mal mit 'ner anderen Tabelle unter FireBird probiert.)
select * from tabelle1 a
where not exists (select 1 from tabelle2 b where a.Hauptnummer = b.Hauptnummer) |
AW: SQL optimieren
Wenn das auch noch zu langsam sein sollte, dann könnte auch so ein Konstrukt funktionieren:
SQL-Code:
Syntaktisch ist es möglich und wird ausgeführt mit diesem Statement:
select * from (
select Tabelle1.HauptNummer from Tabelle1 where Tabelle1.ergaenzung <> 'N' and Tabelle1.Storno is Null ) a where not exists ( select 1 from tabelle2 b where a.ergaenzung = b.ergaenzung and a.Hauptnummer = b.Hauptnummer) )
SQL-Code:
(und liefert sogar ein paar total kaputte Datensätze :-()
select * from (select * from textverwaltung where id is null) a
where not exists (select 1 from textverwaltung b where a.id = b.id); |
AW: SQL optimieren
Zitat:
Bezüglich der "Indexe überall", viel hilft nicht unbedingt viel. "Storno is null " bringt mit Index eher keine zusätzliche Performance. An solchen Stellen (vermuteter Charakter eines Feldes, das Storno genannt wird) bietet sich die Arbeit mit expliziten Werten an. Also 0/1, True/false oder sowas. Vorbelegung durch "Default" Angabe auf Feldebene der Tabellendefinition und "not null" Constraint. Das garantiert, dass immer Werte vorhanden sind, die dann auch indiziert werden können. Gegenanzeige dazu ist leider wieder, dass ein normaler Index mit lediglich einer Handvoll unterschiedlicher Werte nicht sehr viel bringt. |
AW: SQL optimieren
SQL-Code:
Ein Feld das explizit NULL sein soll in das JOIN zu nehmen erscheint mir nicht so sinnvoll.
Select Tabelle1.HauptNummer
from Tabell1 Left Outer Join Tabelle2 on Tabell1.ergaenzung = Tabelle2.ergaenzung and Tabell1.HauptNummer = Tabelle2.HauptNummer where Tabelle2.ergaenzung is null and Tabell1.ergaenzung <> 'N' and Tabell1.Storno is Null
SQL-Code:
Gruß
Select Tabelle1.HauptNummer
from Tabell1 Left Outer Join Tabelle2 on Tabell1.HauptNummer = Tabelle2.HauptNummer where Tabelle2.ergaenzung is null and Tabell1.ergaenzung is null and Tabell1.ergaenzung <> 'N' and Tabell1.Storno is Null K-H |
AW: SQL optimieren
Zitat:
Zitat:
|
AW: SQL optimieren
Zitat:
Darum das
SQL-Code:
wobei ich
Tabelle2.ergaenzung is NULL
SQL-Code:
bevorzuge (in der Annahme, das es sich um den Schlüssel handelt)
Tabelle2.Hauptnummer is NULL
Gruß K-H |
AW: SQL optimieren
Also ich habe es so verstanden, dass beide Felder "Hauptnummer" und "Ergänzung" notwendig Join Kriterien sind. Die "anschließende" Null Prüfung auf Feld "Tabelle2.Ergänzung" dient der Feststellung, dass kein Datensatz passender gefunden wurde. (Was auch mit jedem anderen Feld der Tabelle2 möglich wäre, da es ja genau um die nicht gefundenen geht)
|
AW: SQL optimieren
Zitat:
Gruß K-H |
AW: SQL optimieren
Was ich nicht verstehe:
Warum per Leftjoin alles zusammensuchen und dann per "irgendeine Spalte" die immer Null ist heraussuchen, was es nicht gibt? Wäre da nicht sowas deutlich einfacher?
SQL-Code:
Wobei ich die Prüfung auf Nichtexistenz mit not Exists für deutlich sinnvoller halte und das erfahrungsgemäß auch die schnellste Variante ist.
select hauptnummer from tabell1
where Tabell1.ergaenzung <> 'N' and Tabell1.Storno is Null and Tabell1.hauptnummer not in ( select hauptnummer from tabelle2 where Tabelle2.ergaenzung is null ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz