AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL-Abfrage optimieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Abfrage optimieren

Ein Thema von Xong · begonnen am 27. Feb 2008 · letzter Beitrag vom 27. Feb 2008
Antwort Antwort
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#1

SQL-Abfrage optimieren

  Alt 27. Feb 2008, 10:53
Datenbank: MSSQL • Version: 2005 • Zugriff über: irrellevelle
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: SQL-Abfrage optimieren

  Alt 27. Feb 2008, 10:56
AND (GR_ID in(5, 39, ...) Warum DISTINCT?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#3

Re: SQL-Abfrage optimieren

  Alt 27. Feb 2008, 11:01
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?)
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#4

Re: SQL-Abfrage optimieren

  Alt 27. Feb 2008, 11:47
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
Gruß
Norman
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: SQL-Abfrage optimieren

  Alt 27. Feb 2008, 12:30
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?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: SQL-Abfrage optimieren

  Alt 27. Feb 2008, 12:37
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 SELECT * weg - das wäre für mich der erste Optinierungsschritt.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#7

Re: SQL-Abfrage optimieren

  Alt 27. Feb 2008, 12:55
Zitat von Union:
Dann fällt auf jeden Fall das schreckliche 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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: SQL-Abfrage optimieren

  Alt 27. Feb 2008, 12:59
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#9

Re: SQL-Abfrage optimieren

  Alt 27. Feb 2008, 13:32
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:47 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