Hi,

ich habe ein Problem bei einer SQL-Abfrage betreffend der benötigten Laufzeit, aber erst mal zur Problemstellung:

Ich habe Kunden und Artikel. Neben dem Standard-Artikelpreis, soll für jeden Kunden ein eigener Rabatt festgesetzt werden können. Um ein bisschen die Performance zu testen, habe ich 1000 Kunden und 1000 Artikel angelegt
und Zufallsrabatte gesetzt: Kunden x Artikel -> also 1000000 Rabatt-Datensätze.

Was ich vorhabe ist, dass man zu einem bestimmten Artikel alle Kunden angezeigt bekommt und entweder mit zugehörigem Rabatt (falls gesetzt) und dem daraus berechneten Endpreis oder halt
nur der Standard-Artikelpreis, wenn halt für den Artikel bzw. den Kunden kein Rabatt vorhanden ist.

Genauso möchte ich auch für einen bestimmten Kunden alle Artikel mit oben bereits erwähnten Informationen anzeigen lassen.

Zu meinem Problem:

Für einen Artikel alle Kunden mit Rabatten und berechneten Endpreisen anzeigen lassen ist kein Problem. Die benötigte
Zeit bei den 1000000 Rabatten ist zufriedenstellend!

ABER: Beim Anzeigen aller Artikel für einen Kunden beträgt die benötigte Zeit allerdings mehr als !8 Sekunden!, was
natürlich alles andere als aktzeptabel ist. Ich finde aber einfach nicht die richtige Abfrage um ein ähnlich gutes Ergebnis wie bei
der ersten Abfrage zu erhalten, wobei ich den Unterschied zu beiden im zeitlichen Umfang nicht wirklich ausmachen und dann halt optimieren kann:

Hier mal die Randinformation:

- Tabelle 'Customers' (customers_id, ...)
- Tabelle 'Articles' (articles_id, articles_name, ...)
- Tabelle 'Articles_Prices' (articles_id, articles_price_netto)
- Tabelle 'Articles_Customers_PriceList' (articles_id, customers_id, articles_price_discount)

Abfrage 1 mit guter Laufzeit (für einen Artikel (zB. ID = 11) alle Kunden):

SELECT C.customers_id, COALESCE(ACP.articles_price_discount,0) AS discount, CAST((AP.articles_price_netto-AP.articles_price_netto/100*COALESCE(ACP.articles_price_discount,0)) AS DECIMAL(15,4)) AS discount_result

FROM ARTICLES_PRICES AS AP, CUSTOMERS AS C LEFT JOIN ARTICLES_CUSTOMERS_PRICELIST AS ACP ON C.customers_id = ACP.customers_id AND ACP.articles_id = '11'

WHERE AP.articles_id = '11' order by C.customers_id;
Abfrage 2 mit 8-Sekunden Laufzeit (für einen Kunden (zB. ID = 26) alle Artikel):

SELECT AP.articles_id, A.articles_name, AP.articles_price_netto, COALESCE(ACP.articles_price_discount,0),
CAST((AP.articles_price_netto*(COALESCE(ACP.articl es_price_discount,0)/100)) AS DECIMAL(15,4)) AS discount_result

FROM ARTICLES AS A, ARTICLES_PRICES AS AP LEFT JOIN ARTICLES_CUSTOMERS_PRICELIST AS ACP ON ACP.customers_id = '26' AND AP.articles_id = ACP.articles_id

WHERE AP.articles_id = A.articles_id order by A.articles_id;
Selbst in vereinfachter Form ohne Berechnungen der Endpreise dauert es nur unerheblich kürzer (mal 3 Versionen):

Code:
1.) SELECT AP.articles_id, ACP.articles_price_discount FROM ARTICLES_PRICES AS AP LEFT JOIN ARTICLES_CUSTOMERS_PRICELIST AS ACP ON ACP.CUSTOMERS_ID = '26' AND AP.ARTICLES_ID = ACP.ARTICLES_ID;
2.) SELECT AP.articles_id, ACP.articles_price_discount FROM ARTICLES_PRICES AS AP LEFT JOIN ARTICLES_CUSTOMERS_PRICELIST AS ACP ON AP.ARTICLES_ID = ACP.ARTICLES_ID WHERE ACP.CUSTOMERS_ID = '26';
3.) SELECT AP.articles_id, ACP.articles_price_discount FROM ARTICLES_PRICES AS AP LEFT JOIN ARTICLES_CUSTOMERS_PRICELIST AS ACP ON ACP.CUSTOMERS_ID = '26' WHERE ACP.articles_ID = AP.ARTICLES_ID ;
Selbst ohne Berechnungen braucht man mit der vereinfachten Form recht lange. Woran liegt das genau? Wie muss ich das ganze umstellen?
Wie kommen diese erheblichen Unterschiede zur 1. Abfrage zustande?
Ich habe schon recht viel ausprobiert, komme aber nicht auf die Loesung.

Habt ihr da Loesungsansaetze??

Vielen Dank schon mal im Voraus