AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?
Thema durchsuchen
Ansicht
Themen-Optionen

SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

Ein Thema von juergen · begonnen am 30. Mär 2011 · letzter Beitrag vom 1. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#1

SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 30. Mär 2011, 22:12
Datenbank: Pervasive • Version: V 10 • Zugriff über: PDAC
Hallo zusammen,

nach einigen Tests habe ich festgestellt, dass meine momentane Performancebremse von einer Left-Join-Bedingung kommt.
Wenn ich das Ganze in einer where-Bedingung packe ist es um Faktor 30 schneller.

Nachfolgend meine 2 (rudimentären) SQL-Statements:
SQL-Code:
//Datenmenge ist nicht richtig, da hier die Kundendatensätze NICHT enthalten sind, welche KEINE Ansprechpartner (P.Name) hinterlegt haben. Dafür aber sehr schnell
Select A.kundenname, P.Name from AdressStamm as A, Kontaktpersonen as P where P.DBAA_RECID = A.Identifikation

//Datenmenge ist richtig, aber extrem langsam (knapp über Faktor 30)
Select A.kundenname, P.Name from AdressStamm as A left JOIN Kontaktpersonen as P on P.DBAA_RECID = A.Identifikation
Da ich hier keinerlei Erfahrung habe und nicht weiß wo ich ansetzen könnte, meine Frage ob das "normal" ist.
Mache ich hier etwas grundlegendes falsch oder woran kann dieser große Performance-Unterschied liegen?

Vielen Dank schon mal für hilfreiche Hinweise!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von mkinzler (31. Mär 2011 um 08:37 Uhr) Grund: SQL-Tag gefixt
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 30. Mär 2011, 22:18
Sind beide Spalten mit einem Index versehen?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 30. Mär 2011, 22:18
Hi,

ohne die genaue Datenbank ist das ein bisschen wie Stochern im Nebel...

was mir spontan einfällt:

Wenn bei der ersten Datenmenge 10 Datensätze zurückkommen und bei der zweiten 10.000.000.000 (kannst wegen mir noch ein paar nullen ran machen) dann hätten wir das Problem vermutlich schon eingegrenzt...

Wenn P und A nicht verknüpft sind - was steht dann in A.Identifikation? wenn Da NULL drin ist, könntest Du den oberen Fall mit dem hier ausschließen:

Select A.kundenname, P.Name from AdressStamm as A, Kontaktpersonen as P where P.DBAA_RECID = A.Identifikation OR A.Identifikation IS NULL Normal würde ich so ein Verhalten aber nicht nennen, wobei meine Erfahrung mit Pervasive schon 10 Jahre zurück liegt...

Geändert von mkinzler (31. Mär 2011 um 08:36 Uhr) Grund: SQL-Tag gefixt
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 30. Mär 2011, 22:27
Hallo,

outer joins sind prinzipiell langsamer als inner joins.

Lösung:
1. Lege einen Dummy-Ansprechpartner an (DB-Id=0, Name=NULL)
2. Neue Kunden bekommen diesen AP zugeordnet.

Jetzt noch ein bissel coden
3.
Neuer AP beim Kunden, Dummy löschen, falls vorhanden
AP gelöscht, ist es der letzte, Dummy zuordnen

je nach DB, geht dss auch über Trigger

Jetzt bekommst du per inner join alle Kunden incl. Ansprechpartner.



Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 30. Mär 2011, 22:46
puhh, so schnelle Antworten.

@ alzaimar,
Ja, Index ist vorhanden.

@ Lemmy,
Der Unterschied in den beiden Datenmenge beträgt ca. 450 Datensätze, also vernachlässigbar.
A.Identifikation ist die eindeutige Rec-Id der Tabelle und kann nicht NULL sein.

Ich glaube nun fast, dass Pervasive an der Stelle Probleme hat. Ich gebe zum Testen das SQL-Statement direkt im SQL Manger von Pervasive ein, also kein Delphi oder anderes Störquellen.
Falls Pervasive Problem haben sollte mit Join's:
Gibt es hierzu vllt. Alternativen? Auch ein INNER Join ist sehr langsam...


//Edit roter Kasten
@ hoika
Punkt 1: Sowas ähnliches hatte ich mir auch schon überlegt, einfach einen leeren Datensatz bei Neuanlage mit anlegen, dann könnte ich ja auch die where-Bedingung anwenden. Ich würde sowas aber ungern so umsetzen.

Schon mal Danke für Eure Antworten!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 31. Mär 2011, 08:35
Hi,
Select A.kundenname, P.Name from AdressStamm as A, Kontaktpersonen as P where P.DBAA_RECID = A.Identifikation OR A.Identifikation IS NULL
Da wir gerade Subsecelct in der Schule haben 'ne Abwandlung hiervon, wobei ich nicht weiß, ob Subselects nicht auch langsam sind (und ob das da unten so richtig ist - wie gesagt gerade erst gelernt):

Select A.kundenname, P.Name from AdressStamm as A, Kontaktpersonen as P where P.DBAA_RECID = A.Identifikation OR A.Identifikation NOT IN (Select Distinct DBAA_RECID From Kontaktpersonen)
Ralph

Geändert von Jumpy (31. Mär 2011 um 11:09 Uhr) Grund: SQL-Tag in Zitat auch noch gefixt
  Mit Zitat antworten Zitat
jobo

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

AW: SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 31. Mär 2011, 10:46
Sind wirklich beide Indices vorhanden?
Was ist die normale Laufzeit? Faktor 30 auf 10 Millisekunden fänd ich nicht so schlimm.
Was sind die absoluten Datenmengen?

Falls die Gesamtmengen groß sind und mangels Ahnung von Pervasive:
Wie sieht es da mit einem Optimizer aus? Gibt es sowas wie Statistiken? Wenn ja, sind die aktuell?

Unabhängig vom der Datenmenge, Index evtl. neu aufbauen.
Gruß, Jo
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#8

AW: SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 31. Mär 2011, 11:02
Schau dir mal die Ausführungspläne der SQLs an.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 31. Mär 2011, 19:31
Hallo zusammen,

die Frage von alzaimar im Post #2 hätte ich besser lesen müssen.
Nach dem für mich deutlicheren Hinweis von jobo im Post #7 muss ich sagen:
- es gibt nur in der Tabelle Kontaktpersonen einen Index auf die Rec-ID der Tabelle AdressStamm.

Wie gesagt ich habe da nicht so die Ahnung:
- muss es denn in der Tabelle AdressStamm auch noch einen Index auf die Rec-ID der Tabelle Kontaktpersonen geben?

Letztlich beträgt die Datenmenge etwas über 14.000 Datensätze, also nicht so viel.
Das Ausführen der SQL-Statements mit der where-Bedingung dauert 5 Sekunden, mit der Left Join-Bedingung 2:33 (Min:sek).

Sowas wie Optimizer oder SQL Ausführungspläne kenne ich für Pervasive nicht.

Schon mal Danke für Eure Hilfe!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

AW: SQL: Left Join 30-fach langsamer wie where-Bedingung. Ist das normal?

  Alt 31. Mär 2011, 19:44
Nun ja, 14k x 14k wäre dann aber fett.

Also: Die DB muss für jede Zeile der 1.Tabelle die passenden Einträge in der 2.Tabelle suchen.

Mit Index geht das EinsFixDrei, ohne sucht die DB sequentiell in der 2.Tabelle. Von vorne nach hinten. Na ja, manchmal nicht ganz, aber prinzipiell schon.

Du musst/solltest einen Index am Besten auf beide Spalten der JOIN-Verknüpfung legen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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:55 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