Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Brett vorm Kopf - SQL Query Problem (https://www.delphipraxis.net/171508-brett-vorm-kopf-sql-query-problem.html)

sega84 9. Nov 2012 10:53

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:
ArtikelNr | LieferantenNr | EKPreis
mit z.B. folgendem Inhalt:
Code:
4711 | 1 | 100,00
4711 | 2 | 99,58
4712 | 3 | 2,00
4712 | 1 | 2,50
Es soll nun der komplette Datensatz (alle Felder) des günstigsten Lieferanten ALLER Artikel ausgegeben werden:
Code:
4711 | 2 | 99,58
4712 | 3 | 2,00
Mithilfe folgender Abfragen erhalte ich momentan die Daten:
Code:
create view daten_1 as select ArtikelNr , MIN(EKPreis) as EKPreis from Preise group by ArtikelNr
Code:
select Preise.*  from daten_1 inner join Preise on Preise.ArtikelNr = daten_1.ArtikelNr and CopPreis.EKPreis = daten_1.EKPreis
Allerdings dauert die Abfrage sehr lange und bei knapp 500.000 Datensätzen ist es nicht akzeptabel.

Habt ihr eventuell eine Idee?

mkinzler 9. Nov 2012 10:58

AW: Brett vorm Kopf - SQL Query Problem
 
Warum der Join?

sega84 9. Nov 2012 11:01

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

mkinzler 9. Nov 2012 11:03

AW: Brett vorm Kopf - SQL Query Problem
 
Der View liefert doch schon den niedrigsten Preis pro Artikel

sega84 9. Nov 2012 11:05

AW: Brett vorm Kopf - SQL Query Problem
 
Das stimmt, allerdings benötige ich noch den Lieferanten. Deshalb auch der Join.

Stevie 9. Nov 2012 11:15

AW: Brett vorm Kopf - SQL Query Problem
 
Das SQL sieht richtig aus (wobei du auch ohne View hinkommen solltest):

Code:
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
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.

sega84 9. Nov 2012 11:21

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.

mkinzler 9. Nov 2012 11:28

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

sega84 9. Nov 2012 11:32

AW: Brett vorm Kopf - SQL Query Problem
 
OK,
vielen Dank!

sega84 9. Nov 2012 11:38

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:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz