Hopsel: (SQL) Abfrage optimieren

Beitrag lesen

Hi Cheatah!
Schön, eine Antwort von dir zu bekommen. :-)

Ich arbeite mit MSSQL-Server 2005.
vorweg: Mit diesem System habe ich keine Erfahrung.

Dann hast du mir immer noch etwas voraus.

SELECT *
Gib die Liste der gewünschten Spalten explizit an. Das dürfte die Performance zwar nicht spürbar beeinflussen, ist aber trotzdem wichtig.

Inwiefern wichtig? Ich brauche jede einzelne Spalte.

WHERE ADRESSEN.IDNR IN (
Existiert auf adressen.idnr ein Index?

Ja.

(ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND
         (GR_ID=5 OR GR_ID=39 /* OR [...] (wird dynamisch hinzugefügt) */)
Existiert ein Index auf adressgru.adr_id *und* gr_id? In welcher Reihenfolge, wie sind Deine Indexe aufgebaut?

Nein, es existieren keine Indizes auf adr_id und gr_id. Würde das einen merklichen Geschwindigkeitsvorteil bringen?
Ist die Reihenfolge bei der Erstellung von Indizes wichtig?

Lässt sich die OR-Verknüpfungskette durch ein IN ersetzen?

Ja. =)

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

Sind die Indexe ggf. optimiert?

Öhm...

Die Abfrage klappt so auch, allerdings dauert sie schon ein paar Millisekündchen.
Lässt sich in Deinem DBMS ein Ausführungsplan des Statements ermitteln?

Ist das mit einer Stored Procedure schon getan?
Kann ich einer solchen eigentlich mehrere Variablen (nämlich die Gruppen-ID-Nummern) übergeben?

Ist folgendes Statement "besser"?

SELECT *  
FROM ADRESSEN  
WHERE IDNR in (  
   SELECT ADR_ID  
   FROM ADRESSGRU  
   WHERE GR_ID in (2,3 /* [...] */)  
)  
ORDER BY NAME1 ASC

MfG H☼psel

--
"It's amazing I won. I was running against peace, prosperity, and incumbency."
George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)