Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage über 2 Tabellen, geschwindikteitsthema (https://www.delphipraxis.net/147019-sql-abfrage-ueber-2-tabellen-geschwindikteitsthema.html)

waldforest 31. Jan 2010 12:00

Datenbank: Firebird • Version: 2.1 • Zugriff über: ZEOS

SQL-Abfrage über 2 Tabellen, geschwindikteitsthema
 
Hallo,
ich habe zwei Tabellen in einer FB-Datenbank.
Nun möchte ich überprüfen, welche Namen, in Tabelle 1 sowie in Tabelle 2 vorhanden sind und mir lediglich die ausgeben lassen, welche in Tabelle 1 aber nicht in Tabelle 2 enthalten sind.

Ein Hinweis ist noch erforderlich. Tabelle 1 enthält ca. 1.000 Datensätze, Tabelle 2 hingegen ca. 35.000 Datensätze.

Ich habe die Abfrage über 2 Arten durchgeführt.

1.) sql.text := 'SELECT * FROM Dat_new WHERE name NOT IN (SELECT name from Dat)';
Hier daurt es ca. 50 Sec. bis zur Ergebnislieferung

2.) sql.text := 'SELECT * FROM Dat_new LEFT JOIN Dat ON Dat_new.name <> Dat.name'
Hier dauet es ca. 110 Sec bis zur Ergebnislieferung


Dies ist natürlich in beiden Fällen rechtlange.

Hat jemand eine Idee, wie ich dies durch eine bessere Abfrage beschleunigen kann ?

mkinzler 31. Jan 2010 12:10

Re: SQL-Abfrage über 2 Tabellen, geschwindikteitsthema
 
Wie sieht es mit den Indizes aus?
Welche der beiden Tabellen ist die große?
Man könnte noch mot not Exists versuchen.

waldforest 31. Jan 2010 12:36

Re: SQL-Abfrage über 2 Tabellen, geschwindikteitsthema
 
Hallo,

Not Exists, scheint es unter scheint unter Firebird 2.1 nicht zu geben, oder warum auch immer nciht zum Laufen bekommen.


Mit Indizes in FB habe ich noch nicht gearbeitet, ist ein Ansatz, mit dem ich mich mal befassen sollten (Vielleicht ein Einlesetipp ???)

Die dat ist die große Datei.

mkinzler 31. Jan 2010 12:42

Re: SQL-Abfrage über 2 Tabellen, geschwindikteitsthema
 
Not Exists sollte es schon länger geben
SQL-Code:
SELECT n.* FROM Dat_new n WHERENOT EXISTS (SELECT d.name from Dat d where d.name = n.name);
Wenn ein Index vorhanden ist, wird dieser anstatt der Einträge in der Tabelle. Lege mal in beiden Tabellen einen Index über das Feld Name an.

waldforest 31. Jan 2010 12:51

Re: SQL-Abfrage über 2 Tabellen, geschwindikteitsthema
 
Hallo,
super, viele Dank das war der Tipp.
Keine Ahnung was ich bisher bei Not Exists gemacht habe. Nun machts wieder spass die Deltas abzufragen.




SELECT n.* FROM Dat_new n WHERE NOT EXISTS (SELECT d.name from Dat d where d.name = n.name);

hoika 1. Feb 2010 07:39

Re: SQL-Abfrage über 2 Tabellen, geschwindikteitsthema
 
Hallo,

Zitat:

Mit Indizes in FB habe ich noch nicht gearbeitet, ist ein Ansatz, mit dem ich mich mal befassen sollten
Indizes sollte auf alle Felder die

in Where und in Joins benutzt werden.

Ausnahme sind Felder mit geringer Selektivität (z.B. M/W für männlich / weiblich),
da sollte man die Query mal mit und mal ohne Index laufen lassen.
Es könnte sein, dass FB mit Index etwas langsamer ist,
wobei das ab FB2 im Vergleich zu FB1.X sehr viel besser gehandhabt wird.

Hier ein schicker Link
1


Über Indizes steht sehr viel im Netz, dass muss auch nicht direkt zu FB passen
(Wikipedia z.B.).


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 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