DB-Abfrage optimieren

04/12/2007 - 09:07 von Carsten Ilwig | Report spam
Hi Leute,
ich habe folgende DB-Abfrage:

SELECT art.artikelNummer
FROM artikelNew art, kennzeichenInfos kzi
WHERE
(art.ReciD = kzi.masterrecid) AND
((kzi.typ = 'artikel') AND ((kzi.kennzeichen = 'FA') AND (kzi.active = 1)))
AND
(not exists
(SELECT kzi.active FROM kennzeicheninfos kzi
WHERE (kzi.masterrecid = art.recid) AND (kzi.typ = 'artikel') AND
(kzi.active = 1) AND
((kzi.kennzeichen = 'GS') OR
(kzi.kennzeichen = 'VS') OR
(kzi.kennzeichen = 'AL'))
)
)

Durch die SELECT-Abfrage innerhalb der WHERE-Klausel dauert die Abfrage ca.
32 sek.
Ohne die SELECT-Abfrage nicht einmal 1 sek.

In der Tabelle ArtikelNew sind ca. 1.800 Datensàtze und in
der Tabelle KennzeichenInfos ca.12.000 Datensàtze.

Der Sinn der Abfrage ist folgender:

Aus der Tabelle "ArtikelNew" sollen nur die Datensàtze ausgelesen werden,
für die es in der Tabelle "KennzeichenInfos"
einen aktiven (active = 1) Eintrag vom typ = 'artikel' gibt mit dem
Kennzeichen = 'FA'.
Es darf aber für diesen Artikel keine aktiven Eintrage vom typ = 'artikel'
mit den Kennzeichen 'GS', oder 'VS', oder 'AL' geben.

Verbunden ist die Tabelle "KennzeichenInfos kzi" mit der Tabelle "ArtikelNew
art" über die Beziehung "art.RECID = kzi.MasterRecID".


Wie muss ich die gesamte SQL-Abfrage àndern, damit sie schneller làuft?

Vielen Dank für Eure Hilfe
Carsten
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
04/12/2007 - 09:31 | Warnen spam
Hallo Carsten,

"Carsten Ilwig" schrieb

ich habe folgende DB-Abfrage:

SELECT art.artikelNummer
FROM artikelNew art, kennzeichenInfos kzi
WHERE
(art.ReciD = kzi.masterrecid) AND
((kzi.typ = 'artikel') AND ((kzi.kennzeichen = 'FA') AND (kzi.active = 1))) AND
(not exists
(SELECT kzi.active FROM kennzeicheninfos kzi
WHERE (kzi.masterrecid = art.recid) AND (kzi.typ = 'artikel') AND (kzi.active = 1) AND
((kzi.kennzeichen = 'GS') OR
(kzi.kennzeichen = 'VS') OR
(kzi.kennzeichen = 'AL'))
)
)



Die würde ich, ohne jetzt zu wissen, ob dabei genau das gleiche Ergebnis
rauskommt, so umstellen:

SELECT art.artikelNummer
FROM artikelNew art, kennzeichenInfos kzi
WHERE art.ReciD = kzi.masterrecid
AND kzi.typ = 'artikel'
AND kzi.kennzeichen = 'FA'
AND kzi.active = 1
AND art.ReciD NOT IN
(
SELECT kzi.masterrecid
FROM kennzeicheninfos kzi
AND kzi.typ = 'artikel'
AND kzi.active = 1
AND kzi.kennzeichen IN ( 'GS', 'VS', 'AL' )
)

Ob Du im àußeren SELECT Statement beide Tabellen brauchst oder ob man das
ggfs. gleich ins SubSelect mit aufnehmen kann, kann ich nicht beurteilen.

Für mich liest sich das ganze allerdings etwas "komisch", da Du im àußeren
Statement bspw. auf kennzeichen = 'FA' prüfst, im inneren dann wiederum
'GS, ... ausschließt. Meiner Meinung nach brauchst Du das gar nicht mehr
prüfen. Das innerr SQL Statement bewirkt dann irgendwie gar nichts!?

Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen