Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Absturz bei Abfrage

Begonnen von gino79, Juni 25, 2010, 12:50:27

⏪ vorheriges - nächstes ⏩

gino79

Hallo Kollegen,

Ich habe das Problem das mir z.B. bei nachfolgender Abfrage das System abstürzt bzw. kaum noch reagiert.

Hat jemand ein Tipp wie man die Abfrage verbesern kann, damit die Performance besser ist.

Hier die Abfrage für die Vorselektierung:
SELECT
IIf([standtage]<0,"A prüfen",IIf([standtage]<31,"B Bis 30",IIf([standtage]<61,"C 031-60",IIf([standtage]<91,"D 061-90",IIf([standtage]<121,"E 091-120",IIf([standtage]<181,"F 121-180",IIf([standtage]<361,"G 181-360",IIf([standtage]<721,"H 361-720",IIf([standtage]<=1000,"I 721-999",IIf([standtage]>1000,"J >1000","K Prüfen")))))))))) AS StKa,
IIf([AuszeichnungspreisAktuell]<5000,"A U 5000",IIf([AuszeichnungspreisAktuell]<10000,"B 5000-10000",IIf([AuszeichnungspreisAktuell]<15000,"C 10000-15000",IIf([AuszeichnungspreisAktuell]<20000,"D 15000-20000",IIf([AuszeichnungspreisAktuell]>=20000,"E Ü 20000","F Prüfen"))))) AS PrKa,
IIf(DateDiff("m",[erstzulassung],Date())<0,"A Prüfen",IIf(DateDiff("m",[erstzulassung],Date())<=12,"B bis 12",IIf(DateDiff("m",[erstzulassung],Date())<=24,"C 12 bis 24",IIf(DateDiff("m",[erstzulassung],Date())<=36,"D 24 bis 36",IIf(DateDiff("m",[erstzulassung],Date())<=48,"E 36 bis 48",IIf(DateDiff("m",[erstzulassung],Date())<=60,"F 48 bis 60",IIf(DateDiff("m",[erstzulassung],Date())>60,"G >60","H Prüfen"))))))) AS AlKa,
DateDiff("m",[erstzulassung],Date()) AS [Alter],
DateDiff("d",Haendlerdaten.LetzterImport,#6/17/2010#) AS LetzterImp,
Verkauf.* FROM Haendlerdaten INNER JOIN Verkauf ON Haendlerdaten.HerstellerNummer = Verkauf.HerstellerNummer
WHERE (((Verkauf.Erstzulassung) Is Not Null) AND ((Verkauf.Standtage)<=10000) AND ((Verkauf.Auslieferungsdatum) Between #6/10/2010# And #6/17/2010#));

Hier die Abfrage in der ich dann meine Berechnung mache:

SELECT qry_V_KAT.StKa,
Count(qry_V_KAT.ID) AS Alle, CLng(DCount("[ID]","[qry_V_KAT]","[StKA]='" & [StKa] & "' AND [Hersteller] = 'Ford'")) AS Ford,
CLng(DCount("[ID]","[qry_V_KAT]","[StKA]='" & [StKa] & "' AND [Hersteller] <> 'Ford'")) AS Fremd
FROM qry_V_KAT
GROUP BY qry_V_KAT.StKa
ORDER BY qry_V_KAT.StKa;

Die Datenbank hat 3 Tabellen, Bestandstabelle, Verkaufstabelle und Händlertabelle. Das größte Problem sind die Abfragen auf die Verkaufstabelle. Dort sind ca. 500.000 Datensätze drin.

database

Hallo,

ohne dass ich dieses Monster  :o auch nur ansatzweise auf meinem Rechner anlysieren möchte, folgende Meinungsäußerung:

Das Problem sind nicht die 500.000 DS in der Verkaufstabelle sondern die verschachtelten Bedinungen im SELECT-Teil der Vorselektion.
Wobei mir auf den erstsen Blick nicht einleuchten will, wozu die Spalten 'PrKa' und 'AlKa' überhaupt dienen sollen, wenn sie in deiner Berechnungsabfrage nicht verwendet werden.

Klar jetzt wirst du vielleicht argumentieren, dass du die Werte anderswo benötigst - sollte das der Fall sein würde ich einmal testen wie sich die Perfomance verhält, wenn die 2 Felder im Abfrageergebnis NICHT vorhanden sind und zwar BEIDE nicht! Nach meinem Dafürhalten ist die Abfrage mit der Spalte 'StKa' auch schon genug geknebelt.

Benötigst du die Ergebnisse wie oben angedeutet, dann könnteest du 2 weitere Abfragen erstellen, die jeweils eines der Felder liefern.
M.E. müsste das erheblich schneller laufen als wenn alle diese Felder in einer einzigen Abfrage zusammengefasst werden.

Zusätzlich könntest du versuchen eine weitere Vorselektion vorzunehmen beruhend auf dieser WHERE-Klausel
ZitatWHERE (((Verkauf.Erstzulassung) Is Not Null) AND ((Verkauf.Standtage)<=10000) AND ((Verkauf.Auslieferungsdatum) Between #6/10/2010# And #6/17/2010#));
wozu natürlich die Abfrage ganz und gar umbauen müßtest - die Bedingungen und etwaige Berechnungen müssen dabei raus,
dieses Ergebnis dann in einer Temp-Tabelle abzulegen (Tabellenerstellungsabfrage) und dann die bedingungsfreudige Abfrage (die abgespeckte Version = ohne die 2 Spalten) drauf loslassen.
Kann mir gut vorstellen, dass da einiges an Datensätzen schon mal wegfällt.

Sicher eine Menge Schreibarbeit, aber auch nur einmalig.. :)

Grüße
Peter

gino79

Danke Peter für den Tipp.

Hattest natürlich recht.
Konnte glücklicherweise die Vorselektierung beim Datendienstleiter beantragen. Somit ist jetzt alles viel schneller.

Danke und Grüße
Gino