Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL optimieren (https://www.delphipraxis.net/190308-sql-optimieren.html)

Dumpfbacke 21. Sep 2016 19:12

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

nahpets 21. Sep 2016 19:25

AW: SQL optimieren
 
Weiß nicht, ob FireBird sowas kann:
SQL-Code:
select * from tabelle1 a
where not exists
(select 1 from tabelle2 b where a.Hauptnummer = b.Hauptnummer)
(Syntaktisch müsste es gehen, habe das gerade mal mit 'ner anderen Tabelle unter FireBird probiert.)

nahpets 21. Sep 2016 19:39

AW: SQL optimieren
 
Wenn das auch noch zu langsam sein sollte, dann könnte auch so ein Konstrukt funktionieren:
SQL-Code:
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)
)
Syntaktisch ist es möglich und wird ausgeführt mit diesem Statement:
SQL-Code:
select * from (select * from textverwaltung where id is null) a
where not exists
(select 1 from textverwaltung b where a.id = b.id);
(und liefert sogar ein paar total kaputte Datensätze :-()

jobo 22. Sep 2016 09:32

AW: SQL optimieren
 
Zitat:

Zitat von Dumpfbacke (Beitrag 1348353)
Das ganze läuft ca. 10 Minuten da in der Tabelle 2 wirklich viele Datensätze liegt.

Wieviel sind denn "wirklich viele" und wie wenig sind in Tabelle 1 (inkl. der Where Bedingungen?)

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.

p80286 22. Sep 2016 10:01

AW: SQL optimieren
 
SQL-Code:
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
Ein Feld das explizit NULL sein soll in das JOIN zu nehmen erscheint mir nicht so sinnvoll.

SQL-Code:
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
Gruß
K-H

jobo 22. Sep 2016 10:19

AW: SQL optimieren
 
Zitat:

Zitat von p80286 (Beitrag 1348433)

Ein Feld das explizit NULL sein soll in das JOIN zu nehmen erscheint mir nicht so sinnvoll.

Darum ging es aber doch oder?
Zitat:

Ich möchte am Ende alle Datensätze der Tabell1 haben bei denen kein Datensatz in der Tabelle2 existiert
man kann es wie schon geposted auch mit not exists machen, mit einem Join plus Not Null Prüfung läuft es aber in dieser Form vermutlich besser.

p80286 22. Sep 2016 10:58

AW: SQL optimieren
 
Zitat:

Zitat von jobo (Beitrag 1348439)
Zitat:

Zitat von p80286 (Beitrag 1348433)

Ein Feld das explizit NULL sein soll in das JOIN zu nehmen erscheint mir nicht so sinnvoll.

Darum ging es aber doch oder?

Da ich die Tabelleninhalte nicht kenne, "weiß ich nicht".
Darum das
SQL-Code:
Tabelle2.ergaenzung is NULL
wobei ich
SQL-Code:
Tabelle2.Hauptnummer is NULL
bevorzuge (in der Annahme, das es sich um den Schlüssel handelt)

Gruß
K-H

jobo 22. Sep 2016 15:27

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)

p80286 22. Sep 2016 17:31

AW: SQL optimieren
 
Zitat:

Zitat von jobo (Beitrag 1348481)
(Was auch mit jedem anderen Feld der Tabelle2 möglich wäre, da es ja genau um die nicht gefundenen geht)

Da habe ich meine Zweifel, da dieses bel. Feld auch bei vorhandenem Datensatz NULL sein könnte. Darum nehme ich meist den IDKey.

Gruß
K-H

nahpets 22. Sep 2016 18:18

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:
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
)
Wobei ich die Prüfung auf Nichtexistenz mit not Exists für deutlich sinnvoller halte und das erfahrungsgemäß auch die schnellste Variante ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz