AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL optimieren

Ein Thema von Dumpfbacke · begonnen am 21. Sep 2016 · letzter Beitrag vom 22. Sep 2016
Antwort Antwort
Seite 1 von 2  1 2      
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

SQL optimieren

  Alt 21. Sep 2016, 20:12
Datenbank: Firebird • Version: V2.5 • Zugriff über: IBX
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 <> 'Nand Tabell1.Storno is Null

Danke Tanja
Tanja
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: SQL optimieren

  Alt 21. Sep 2016, 20:25
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.)

Geändert von nahpets (21. Sep 2016 um 20:40 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: SQL optimieren

  Alt 21. Sep 2016, 20:39
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 <> 'Nand 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 )
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: SQL optimieren

  Alt 22. Sep 2016, 10:32
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: SQL optimieren

  Alt 22. Sep 2016, 11:01
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: SQL optimieren

  Alt 22. Sep 2016, 11:19

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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: SQL optimieren

  Alt 22. Sep 2016, 11:58

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 Tabelle2.ergaenzung is NULL wobei ich Tabelle2.Hauptnummer is NULL bevorzuge (in der Annahme, das es sich um den Schlüssel handelt)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: SQL optimieren

  Alt 22. Sep 2016, 16:27
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)
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: SQL optimieren

  Alt 22. Sep 2016, 18:31
(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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: SQL optimieren

  Alt 22. Sep 2016, 19:18
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 <> 'Nand 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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.
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