PDA

Vollständige Version anzeigen : Abfrage optimieren


polynator
11.05.2011, 11:22
Hallo,

ich habe eine Formel in Access kreiert, die genau das tut was sie soll. Allerdings bremst sie die DB massiv ein (Abfragen dauern über 20min bei nur wenigen 100 Datensätzen):

(select count (*) from [Tabelle2] as [x] where x.[empfänger] = Tabelle2.[empfänger] and x.Kombi1 < Tabelle2.Kombi1)+1

Empfänger können in der Tabelle mehrfach vorkommen und sollen eine Nummer bekommen (immer von 1 beginnend).
Die Kombinationen aus Empfänger und Sender (Kombi1) sind hingegen eindeutig.

Wie zu erkennen ist, nummeriert die Abfrage alle gleichen Empfänger von 1 bis ... durch. Wie kann ich diese Abfrage optimieren oder verbessern?

BSP:

Empfänger1 - 1
Empfänger1 - 2
Empfänger1 - 3
Empfänger2 - 1
Empfänger2 - 2
Empfänger3 - 1

Ich hoffe, ihr habt einen Tip für mich.

CYA Patrick

ebs17
11.05.2011, 11:58
Gibt es Indices in der Tabelle? Den Feldern "empfänger" und "Kombi1" würden sie gut bekommen.

Maxel
11.05.2011, 11:59
Hallo Patrick,

wenn Du das Ergebnis (nur) in einem Bericht benötigst, könntest Du auf eine solche Abfrage verzichten und nur mit Gruppierung und Laufender Summe operieren.

polynator
11.05.2011, 12:22
Gibt es Indices in der Tabelle? Den Feldern "empfänger" und "Kombi1" würden sie gut bekommen.

Hallo,

erst mal danke für Antworten!

die Abfrage habe ich etwas vereinfacht. Sie basiert nicht auf einer Tabelle, sondern auf einer vorherigen Abfrage, die die meisten Datensätze schon vorfiltert (besser für die Übersicht). Von dem her kann ich die Sätze nicht indizieren, oder geht das etwa auch in einer Abfrage?

Hallo Patrick,
wenn Du das Ergebnis (nur) in einem Bericht benötigst, könntest Du auf eine solche Abfrage verzichten und nur mit Gruppierung und Laufender Summe operieren.

Wie kann ich das gleiche Ergebnis denn mit Gruppierungen erreichen? Hast du viellt. ein Beispiel?

Viele Grüße
Patrick

ebs17
11.05.2011, 12:33
oder geht das etwa auch in einer Abfrage?
Nein, ein Index ist in Tabellen anzulegen, wirkt aber auch in verschachtelten Abfragen (wenn man ihn lässt).
Zum Lesen und Auswendiglernen: Performance in Abfragen (http://www.donkarl.com/AEK/AEKDownloads/AEK8_Abfragen_Performance.zip) von Michael Zimmermann
die Abfrage habe ich etwas vereinfacht. Sie basiert nicht auf einer Tabelle, sondern auf einer vorherigen Abfrage
Dort (in dieser Abfrage) wird das Performanceproblem seine Ursache haben. Mit der Ermittlung der laufenden Nummer wird diese Abfrage pro Datensatz ausgeführt, und da wird halt ein vorhandenes Problem vervielfacht und spürbar.

Lanz Rudolf
11.05.2011, 13:01
Hallo
ist evtl meine Muster MDB was für Dich ?

da ist alles mit Sortierung und Gruppierung im Bericht gelöst :)

in der Entwurfsansicht Rechts oben
der komische Button mit ((= (=

polynator
11.05.2011, 14:58
Nein, ein Index ist in Tabellen anzulegen, wirkt aber auch in verschachtelten Abfragen (wenn man ihn lässt).
Zum Lesen und Auswendiglernen: Performance in Abfragen (http://www.donkarl.com/AEK/AEKDownloads/AEK8_Abfragen_Performance.zip) von Michael Zimmermann

Dort (in dieser Abfrage) wird das Performanceproblem seine Ursache haben. Mit der Ermittlung der laufenden Nummer wird diese Abfrage pro Datensatz ausgeführt, und da wird halt ein vorhandenes Problem vervielfacht und spürbar.

Ich habe jetzt auf beide Felder einen Index gelegt, dadurch wurde vor allem die vorherige Abfrage deutlich beschleunigt (dauert max 5 sek).

Habe allerdings immer noch das Problem, dass die oben gepostet Abfrage viel zu lange dauert. Bietet Access hiebei keine adäquate Möglichkeit an, um die entsprechenden Sender "durchzunummerieren"?

Viele Grüße

ebs17
11.05.2011, 15:16
Zeige die vorige Abfrage. Es reicht nicht, einen Index zu haben. Man muss ihn auch nutzen. In vielen Fällen werden hier ohne Not Fehler begangen, nicht nur von Anfängern.
Möglichkeit ... "durchzunummerieren"
Eher nein. In einer Datenbank spricht man SQL. Massendatenverarbeitung braucht i.d.R. keine Reihenfolge, weil ja die Datenmenge auf einmal verarbeitet wird.
Generell sollte man die Notwendigkeit der Ermittlung von laufenden Nummern und Summen auf den Prüfstand stellen, insbesondere dann bei größeren Datenmengen. Wie ich schrieb, wird da pro Datensatz über die gesamte Tabelle/Abfrage aggregiert. Bei größeren Datenmengen steigt der Aufwand dabei überproportional an (mehr Datensätze mit höherem Aufwand pro Datensatz), selbst bei sonst optimalen Bedingungen.

Irgendwann wird es "sinnvoll", die Daten in eine temporäre Tabelle zu übernehmen und mit VBA die Nummerierung durchzuführen. Das man sich andere Nachteile damit einhandelt, ist klar.

Lanz Rudolf
11.05.2011, 15:48
Hallo
wie sind die Felder definiert als Doubel, Long, String .... ?

hast Du allgemeine Performance verbesserungs massnahmen schon gemacht ?

ist das Eine FE (Frontend) / BE (Backend Lösung ?
sind in der Tabelle wirklich nur wenige 100 Datensätzen( was das auch immer heist)?
heist das unter 1'000 ?

polynator
12.05.2011, 07:45
Hallo zusammen,

teilweise sind die Felder als String(60) definiert, teilweise als Double (unsere Auftragsnummern sind 10-stellig). Als sehr überproportioniert. Bei der DB handelt es sich um eine Schnittstelle, die von einem MA wöchentlich ausgeführt wird. Rohdaten kommen rein, werden aufbereitet und als Stammdaten an ein weiteres Tool (Oracle, 10.000 MA) übergeben. Wurde leider aus Budgetgründen so entschieden...

Ich habe mich jetzt dazu entschlossen, die Daten der vorherigen Abfrage in einer Zwischentabelle zu speichern und entsprechend zu indizieren. Ist zwar etwas umständlich, dass ich jetzt ein paar zusätzliche Update-Abfragen brauche. Die Performance ist allerdings dadurch deutlich besser geworden.

Um die einzelnen Datensätze zu nummerieren kann ich weiterhin das "select count (*) from" verwenden.

Vielen Dank für eure Anregungen und Tips! Ich freue mich jedes Mal, wie toll man in diesem Forum unterstützt wird.

Viele Grüße
Patrick