![]() |
Datenbank: SQL Server • Version: 2008 R2 • Zugriff über: UniDAC
Brett vorm Kopf - SQL Query Problem
Hallo zusammen,
habe irgendwie heute ein Brett vorm Kopf... Habe folgende Tabelle:
Code:
mit z.B. folgendem Inhalt:
ArtikelNr | LieferantenNr | EKPreis
Code:
Es soll nun der komplette Datensatz (alle Felder) des günstigsten Lieferanten ALLER Artikel ausgegeben werden:
4711 | 1 | 100,00
4711 | 2 | 99,58 4712 | 3 | 2,00 4712 | 1 | 2,50
Code:
Mithilfe folgender Abfragen erhalte ich momentan die Daten:
4711 | 2 | 99,58
4712 | 3 | 2,00
Code:
create view daten_1 as select ArtikelNr , MIN(EKPreis) as EKPreis from Preise group by ArtikelNr
Code:
Allerdings dauert die Abfrage sehr lange und bei knapp 500.000 Datensätzen ist es nicht akzeptabel.
select Preise.* from daten_1 inner join Preise on Preise.ArtikelNr = daten_1.ArtikelNr and CopPreis.EKPreis = daten_1.EKPreis
Habt ihr eventuell eine Idee? |
AW: Brett vorm Kopf - SQL Query Problem
Warum der Join?
|
AW: Brett vorm Kopf - SQL Query Problem
Um die günstigsten Preise je Artikel mit der Preise Tabelle zu verknüpfen...
Aber vielleicht ist das auch falsch... Es ist Freitag ;) |
AW: Brett vorm Kopf - SQL Query Problem
Der View liefert doch schon den niedrigsten Preis pro Artikel
|
AW: Brett vorm Kopf - SQL Query Problem
Das stimmt, allerdings benötige ich noch den Lieferanten. Deshalb auch der Join.
|
AW: Brett vorm Kopf - SQL Query Problem
Das SQL sieht richtig aus (wobei du auch ohne View hinkommen solltest):
Code:
Ich vermute eher, dass ein Index auf den entsprechenden Feldern fehlt. Schau mal in den Ausführungsplan. Dort wird wahrscheinlich ein Tablescan auftauchen, was die mangelnde Performance erklären würde.
select Preise.* from Preise join
( select ArtikelNr, MIN(EKPreis) as MinEKPreis from Preise group by ArtikelNr ) x on Preise.ArtikelNr = x.ArtikelNr and Preise.EKPreis = x.MinEKPreis |
AW: Brett vorm Kopf - SQL Query Problem
Die Indexe sind vorhanden.
Der Ausführungsplan gibt aus: - Inner Join Kosten 41% - Hash Mtch (Aggregate) Kosten 39% - Clusted Index Scan (auf PK) 10% (2 mal) Mit der View ist mir klar, brauche die View allerdings noch an anderen Stellen. Daher kann ich sie dort ja auch ruhig einbauen. Was passiert aber, wenn es einen Artikeln bei mehreren Lieferanten zum gleichen günstigsten Preis gibt? Es werden dann ja beide Lieferanten ausgegeben, obwohl ich nur einen Datensatz je Artikel-Nr haben möchte. |
AW: Brett vorm Kopf - SQL Query Problem
Liste der Anhänge anzeigen (Anzahl: 1)
Der View scheint keine Index zu haben.
Ich würde hier eher eine Temp-Tabelle verwenden. Nimm einen right join, dann wird nur noch ein Lieferant ausgegeben. [EDIT] Habe das mal testweise in Firebird nachgestellt, für 100000 DS braucht FB knapp 450 ms |
AW: Brett vorm Kopf - SQL Query Problem
OK,
vielen Dank! |
AW: Brett vorm Kopf - SQL Query Problem
Hab es nun soweit geändert.
Ausführungszeit für 198.000 Datensätze: 3 Sekunden Top! Vielen Dank an alle!!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz