Delphi-PRAXiS

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

Xong 27. Feb 2008 10:53

Datenbank: MSSQL • Version: 2005 • Zugriff über: irrellevelle

SQL-Abfrage optimieren
 
Hallo!
Ich kenne mich mit SQL noch nicht sonderlich gut aus, deshalb würde ich gern wissen, ob man das kleine Abfragemonster performanter hinbekommt.
SQL-Code:
SELECT * 
FROM ADRESSEN
WHERE ADRESSEN.IDNR IN (
   SELECT DISTINCT IDNR
   FROM ADRESSEN
      INNER JOIN ADRESSGRU ON
         (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND
         (GR_ID=5 OR GR_ID=39 /* OR [...] (wird dynamisch hinzugefügt) */)
)
ORDER BY NAME1 ASC
Mit dieser Abfrage erreiche ich, dass nur die Adressen angezeigt werden, die in bestimmten Gruppen sind.
Die Abfrage klappt so auch, allerdings dauert sie schon ein paar Millisekündchen.

Hat jemand eine bessere Idee?

LG,
Xong


PS:
Das funktioniert nicht, da DISTINCT ja nicht auf Textfelder angewandt werden darf:
SQL-Code:
SELECT DISTINCT *
FROM ADRESSEN
   INNER JOIN ADRESSGRU ON
      (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND
      (GR_ID=5 OR GR_ID=39 /* OR [...] */)
ORDER BY NAME1 ASC

mkinzler 27. Feb 2008 10:56

Re: SQL-Abfrage optimieren
 
SQL-Code:
AND (GR_ID in(5, 39, ...)
Warum DISTINCT?

Xong 27. Feb 2008 11:01

Re: SQL-Abfrage optimieren
 
Zitat:

Zitat von mkinzler
Warum DISTINCT?

Weil jede Adresse mehreren Gruppen zugeordnet sein kann. Ohne das DISTINCT würden die Adressen, die in x Gruppen sind, auch x-mal angezeigt werden. (Seh ich doch richtig, oder?)

NormanNG 27. Feb 2008 11:47

Re: SQL-Abfrage optimieren
 
Hi,

hier könnte sicher ein Group-By helfen...

SQL-Code:
SELECT *
FROM ADRESSEN
WHERE ADRESSEN.IDNR IN (
   SELECT IDNR
   FROM ADRESSEN
      INNER JOIN ADRESSGRU ON
         (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND
         (GR_ID=5 OR GR_ID=39 /* OR [...] (wird dynamisch hinzugefügt) */)
   group by IDNR
)
ORDER BY NAME1 ASC

alzaimar 27. Feb 2008 12:30

Re: SQL-Abfrage optimieren
 
Vielleicht bin ich zu blöd, aber wieso nicht einfach so:

SQL-Code:
Select * 
from Adressen
where ADRESSEN.IDNR in (
    select distinct adrID from ADRESSGRU where GR_ID in (39,45,12,3,4,5)
    )
Und statt eine ellenlange 'OR'-Kette zu basteln, baust du dir die Komma-Liste.

PS: Group By sollte langsam sein, oder?

Union 27. Feb 2008 12:37

Re: SQL-Abfrage optimieren
 
Zitat:

Zitat von Alzaimar
Group By sollte langsam sein, oder

Das kommt auf die Datenbank und auf den Stand des Mondes an. Sollte man aber mal ausprobieren und von der Performance her vergleichen. Dann fällt auf jeden Fall das schreckliche
SQL-Code:
SELECT *
weg - das wäre für mich der erste Optinierungsschritt.

Xong 27. Feb 2008 12:55

Re: SQL-Abfrage optimieren
 
Zitat:

Zitat von Union
Dann fällt auf jeden Fall das schreckliche
SQL-Code:
SELECT *
weg - das wäre für mich der erste Optinierungsschritt.

Kannst du das für mich noch begründen. =)

Ich hab drei unterschiedliche Möglichkeiten für Abfragen erstellt:
SQL-Code:
SELECT *
FROM ADRESSEN
WHERE ADRESSEN.IDNR IN (
   SELECT DISTINCT IDNR
   FROM ADRESSEN
      INNER JOIN ADRESSGRU ON
         (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND
         GR_ID in (2,3 /* [...] */)
)
ORDER BY NAME1 ASC

SQL-Code:
SELECT *
FROM ADRESSEN
WHERE ADRESSEN.IDNR IN (
   SELECT IDNR
   FROM ADRESSEN
      INNER JOIN ADRESSGRU ON
         (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND
         GR_ID in (2,3 /* [...] */)
   GROUP BY IDNR
)
ORDER BY NAME1 ASC

SQL-Code:
SELECT *
FROM ADRESSEN
WHERE IDNR in (
   SELECT ADR_ID
   FROM ADRESSGRU
   WHERE GR_ID in (2,3 /* [...] */)
)
ORDER BY NAME1 ASC
Diese Abfrage ist nach einem simplen Test am performantesten. Spricht etwas dagegen, mit der Unterabfrage zu arbeiten?
Kann man das noch weiter optimieren? (Sieht fast so aus wie die von alzaimar, dessen Abfrage ähnlich schnell ist.)

LG,
Xong

Union 27. Feb 2008 12:59

Re: SQL-Abfrage optimieren
 
Zitat:

Kannst du das für mich noch begründen. =)
Man sollte möglichst nur die Daten vom Server holen, die man auch braucht. Wenn Deine Adressentabelle sehr viele Felder hat, führt ein SELECT * zu einem wesentlich höheren Datenvolumen, größerer Belastung für den Server, das Netzwerk und den Client.

Xong 27. Feb 2008 13:32

Re: SQL-Abfrage optimieren
 
Zitat:

Zitat von Union
Zitat:

Kannst du das für mich noch begründen. =)
Man sollte möglichst nur die Daten vom Server holen, die man auch braucht. Wenn Deine Adressentabelle sehr viele Felder hat, führt ein SELECT * zu einem wesentlich höheren Datenvolumen, größerer Belastung für den Server, das Netzwerk und den Client.

Ich hätte nicht gedacht, dass das solch einen Unterschied macht: Ohne SELECT * ist meine Abfrage um 1/3 schneller!

Danke an euch alle.


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