SQL SQL Abfrage benötigt zu viel Zeit

Murphy9904

Lt. Junior Grade
Registriert
Mai 2007
Beiträge
344
Hi,

Ich bräuchte Hilfe für eine SQL Abfrage und zwar:

CW22W2QzdE.png


Ich möchte alle Artikel haben die in den letzten 4 Monaten nicht verkauft wurden.

Das funtktioniert super so: (dauert weniger als ne Sekunde)
Select * from [XXX].[dbo].[Article]
where ArticleID not in(
SELECT distinct(a.ArticleID)
FROM [XXX].[dbo].[Article] as a
join [XXX].[dbo].ShipmentItem as si on a.ArticleID = si.ArticleID
join [XXX].[dbo].Shipment as s on s.ShipmentID = si.ShipmentID
where s.CreateDate > DATEADD(MONTH ,-4 , GETDATE()) )


Wenn ich jetzt aber das ganze um eine Where erweitert dauert es endlos lange:

Select * from [XXX].[dbo].[Article]
where ArticleID not in(
SELECT distinct(a.ArticleID)
FROM [XXX].[dbo].[Article] as a
join [XXX].[dbo].ShipmentItem as si on a.ArticleID = si.ArticleID
join [XXX].[dbo].Shipment as s on s.ShipmentID = si.ShipmentID
where s.CreateDate > DATEADD(MONTH ,-4 , GETDATE()) )

where Stock > 0


Ich hab so das Gefühl das er jetzt für jede Zeile anfängt das "SubQuery" auszuführen - warum denn?
das kann doch nicht so schwer sein ;)

Wenn ihr noch Fragen habt fragt bitte, ich bin leider nicht so der Held im erklähren deshalb hab ich auch ein Bild gemalt ;)

Würde mich freuen wenn mir jemand helfen kann.

Dankeschön :)

LG Murphy
 

Anhänge

  • CW22W2QzdE.png
    CW22W2QzdE.png
    4,2 KB · Aufrufe: 183
keine unterabfragen verwenden. statt dessen mit outer join arbeiten. das ist um welten performanter, vor allem bei großen datenmengen.

select distinct c.artikel
from shipmentitem a inner join shipment b
bedingung datum = ...
right outer join artikel c
where a(oder b). spalte egal is null

verknüfpungen der tabellen mußt du noch setzen
 
Zuletzt bearbeitet:
Reicht das Subselect nicht schon aus?

Select * from [XXX].[dbo].[Article]
left join [XXX].[dbo].ShipmentItem as si on a.ArticleID = si.ArticleID
left join [XXX].[dbo].Shipment as s on s.ShipmentID = si.ShipmentID
where s.CreateDate > DATEADD(MONTH ,-4 , GETDATE()) and ...

Beim SQL Server sind Subselects immer tödlich langsam.
LG
 
Das Where am Ende ist dein Problem.

Das Where für die Abfrage ist nämlich schon in Zeile 2..

Lösung: das "where" in der letzten Zeile in ein "and" und fertig
 
Cool für die schnellen Antworten,

und Danke an tm0975 genau so hat es funktioniert :) Super!!!

@die andren: Ups das hatte ich nur noch schnell reingeschrieben, ich hatte es natürlich mit and versucht.


LG Murphy
 
Abgesehen von den obigen Statements, helfen auch noch INDEXE, um eine Suche performanter zu machen.
 
Allgemein kannst du deine Query zb mal in PhPmyAdmin mit EXPLAIN ausführen (EXPLAIN SELECT ...). DA kannst du dir genau anschauen, was wie lang braucht und dann deine Queries dementsprechend umstellen.
 
Zurück
Oben