AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Brett vorm Kopf - SQL Query Problem
Thema durchsuchen
Ansicht
Themen-Optionen

Brett vorm Kopf - SQL Query Problem

Ein Thema von sega84 · begonnen am 9. Nov 2012 · letzter Beitrag vom 16. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2      
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#1

Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 11:53
Datenbank: SQL Server • Version: 2008 R2 • Zugriff über: UniDAC
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 11:58
Warum der Join?
Markus Kinzler
  Mit Zitat antworten Zitat
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 12:01
Um die günstigsten Preise je Artikel mit der Preise Tabelle zu verknüpfen...
Aber vielleicht ist das auch falsch...
Es ist Freitag
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 12:03
Der View liefert doch schon den niedrigsten Preis pro Artikel
Markus Kinzler
  Mit Zitat antworten Zitat
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 12:05
Das stimmt, allerdings benötige ich noch den Lieferanten. Deshalb auch der Join.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 12:15
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 12:21
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 12:28
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
Miniaturansicht angehängter Grafiken
preisetest.png  
Markus Kinzler

Geändert von mkinzler ( 9. Nov 2012 um 12:36 Uhr)
  Mit Zitat antworten Zitat
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 12:32
OK,
vielen Dank!
  Mit Zitat antworten Zitat
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Brett vorm Kopf - SQL Query Problem

  Alt 9. Nov 2012, 12:38
Hab es nun soweit geändert.
Ausführungszeit für 198.000 Datensätze: 3 Sekunden
Top!
Vielen Dank an alle!!!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 Uhr.
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