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:)