Office: (Office 2007) Beschleunigung einer Abfrage

Helfe beim Thema Beschleunigung einer Abfrage in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo, ich habe eine Abfrage mit 10 Feldern - darunter 2, in denen mehrere Tabellenfelder zusammengefasst werden - und 3 Feldern mit je einer... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Toffel13, 6. Juni 2015.

  1. Beschleunigung einer Abfrage


    Hallo,

    ich habe eine Abfrage mit 10 Feldern - darunter 2, in denen mehrere Tabellenfelder zusammengefasst werden - und 3 Feldern mit je einer Bedingung. Zwei der Bedingungen sind einfach, z. B. "€/kg". Die dritte Bedingung bezieht sich auf die Auswahl einer Combobox. Die Abfrage basiert auf 16 Tabellen. Soweit ist das noch nichts Besonderes. Die Ausführung der Abfrage dauert allerdings über 3 min. Wenn ich die Bedingung mit der Combobox durch eine Zahl ersetze (für die ID, die übergeben wird), ändert sich nichts. Wenn ich die Bedingung allerdings entferne, dauert es nur noch einen Bruchteil einer Sekunde. Wie kann eine einzige Bedingung eine Abfrage so stark verlangsamen? Das Ergebnis wird dabei etwa von 230 auf 30 DS reduziert. Und was kann ich tun, um die Berechnung zu beschleunigen?

    Viele Grüße
    Steffen

    :)
     
    Toffel13, 6. Juni 2015
    #1
  2. Hallo!

    .. bis du die ersten Datensätze siehst, oder bis du zum letzten Datensatz kommst?
    Anm.: Access zeigt in einer Abfrage oder Formular bereits Datensätze an, während der Rest noch gefiltert wird.

    Code:
    ... wird von Jet glaube ich zu "not =" umgeformt und das lässt in Jet keine Index-Nutzung zu.

    Allerdings sollte bei einer Ausgangsdatenmenge von 230 Datensätzen ein Tablescan kein Problem sein.
    Oder sind die 230 DS bereits eine vorgefilterte Datenmenge?
    Wenn z. B. die Tabelle mit dem Feld, das auf "€/kg" gefiltert wird ein paar Millionen Datensätze hat und dieser Filter zu einem Table scan über alle DS führt, kann das dauern.

    Zum Ausprobieren:
    Ersetze "€/kg" durch (< "€/kg" AND > "€/kg").

    Vermutlich spielt die Abarbeitungsreihenfolge der Filter inkl. Join-Bedingungen eine Rolle.
    Den aktuellen Ausführungsplan (Jet Showplan) könntest du dir z. B. mittels ShowplanCapturer von Sascha Trowitzsch ansehen.


    Da 16 Tabellen in der Abfrage miteinander verknüpft sind: sind das Access-Tabellen oder eventuell ODBC-verknüpfte Tabellen aus einem aktivem Backend?


    Anm.: dass in den 16 Tabellen passende Indizes enthalten sind, setze ich einfach einmal voraus. *wink.gif*

    mfg
    Josef
     
    Josef P., 8. Juni 2015
    #2
  3. Hallo Josef,

    ich habe den Fehler offenbar gerade gefunden (leider etwas zu spät, sorry). Eine Tabelle war doppelt enthalten. Seltsamerweise waren beide auf die gleiche Art verknüpft. Durch zwischenzeitliche Änderungen hatte ich bei der Erstellung wohl vermutet, dass die Verknüpfungen deshalb fehlten (ist aber schon etwas länger her). Dadurch sind dann wohl überflüssige Schleifen entstanden. Komischerweise hatte die Abfrage aber bis vor kurzem noch deutlich schneller funktioniert.

    Ich bekomme ein Ergebnis (Abfrage, Formular) immer erst angezeigt, wenn die Abfrage vollständig berechnet wurde.

    ... wird von Jet glaube ich zu "not =" umgeformt und das lässt keine Index-Nutzung zu.

    Allerdings sollte bei einer Ausgangsdatenmenge von 230 Datensätzen ein Tablescan kein Problem sein.
    Oder sind die 230 DS bereits eine vorgefilterte Datenmenge?

    Zum Ausprobieren:
    Ersetze "€/kg" durch (< "€/kg" AND > "€/kg").

    Vermutlich spielt die Abarbeitungsreihenfolge der Filter inkl. Join-Bedingungen eine Rolle.
    Den aktuellen Ausführungsplan (Jet Showplan) könntest du dir z. B. mittels ShowplanCapturer von Sascha Trowitzsch ansehen.


    Da 16 Tabellen in der Abfrage miteinander verknüpft sind: sind das Access-Tabellen oder eventuell ODBC-verknüpfte Tabelle aus einem aktivem Backend?


    Anm.: dass in den 16 Tabellen passende Indizes enthalten sind, setze ich einfach einmal voraus. *wink.gif*

    Das sollte sich damit erledigt haben. Danke aber trotzdem für die Ausführungen. Das kann in anderen Fällen nützlich sein.

    Grüße
    Steffen
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    Toffel13, 8. Juni 2015
    #3
  4. Beschleunigung einer Abfrage

    Hallo,

    das war wohl doch nicht die Ursache. Aus irgend einem Grund dauert die Abfrage jetzt doch wieder länger. Ich werde noch mal alles durchgehen.

    Grüße
    Steffen
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    Toffel13, 8. Juni 2015
    #4
  5. Hallo Josef,

    ... wird von Jet glaube ich zu "not =" umgeformt und das lässt in Jet keine Index-Nutzung zu.

    Allerdings sollte bei einer Ausgangsdatenmenge von 230 Datensätzen ein Tablescan kein Problem sein.
    Oder sind die 230 DS bereits eine vorgefilterte Datenmenge?
    Wenn z. B. die Tabelle mit dem Feld, das auf "€/kg" gefiltert wird ein paar Millionen Datensätze hat und dieser Filter zu einem Table scan über alle DS führt, kann das dauern.

    Zum Ausprobieren:
    Ersetze "€/kg" durch (< "€/kg" AND > "€/kg").

    < "€/kg" AND > "€/kg" funktioniert nicht. Die Abfrage zeigt dann keine Ergebnisse mehr. Offenbar funktionieren nicht mit Text. ist anscheinend unabhängig vom Datentyp!?
    Ich habe als Bedingung jetzt Nicht "€/kg" eingefügt.

    Das kann ich hier nicht ausführen und werde es mir daher später ansehen.

    Das sind normale Access-Tabellen. Auch die Abfrage wurde in der Entwurfsansicht und nicht durch SQL-Eingabe erstellt.

    Würde die Abfrage sonst überhaupt funktionieren bzw. ein Ergebnis liefern?

    Grüße
    Steffen
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    Toffel13, 8. Juni 2015
    #5
  6. Hallo!

    Da muss OR statt AND rein.
    Ein Wert kann nicht größer als "x" und gleichzeitig kleiner als "x" sein. *wink.gif*

    Bezüglich Indizes:
    Eine Abfrage kann man auch auf Tabellen ohne Indizes machen. Ein Index kann aber das Filtern beschleunigen.

    mfg
    Josef
     
    Josef P., 8. Juni 2015
    #6
  7. Die Vergleichsoperatoren '' funktionieren durchaus mit Text.
    Es werden die ASCII Codes der einzelnen Zeichen verglichen.
     
    hcscherzer, 8. Juni 2015
    #7
  8. Beschleunigung einer Abfrage

    Stimmt auch wieder. *Smilie Leider geht die Abfrage damit aber nicht schneller.

    Die doppelte Tabelle scheint immerhin ein Fehler gewesen zu sein. Die Abfrage dauert jetzt noch ca. 1 min. Komischerweise ging es kurz nachdem ich die Tabelle entfernt hatte innerhalb weniger Sekunden.
    Wenn ich einen der Filter entferne, verkürzt sich die Rechenzeit enorm auf etwa 5 sec.

    Grüße
    Steffen
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    Toffel13, 8. Juni 2015
    #8
  9. Wenn du die SQL-Anweisung (in lesbar formatierter Form) zeigst, kann vielleicht jemand eine mögliche "Bremse" erkennen.

    mfg
    Josef
     
    Josef P., 8. Juni 2015
    #9
  10. Hallo,

    hast du mal ausprobiert, dir die 230 DS komplett in einer (gespeicherten) Abfrage zurückgeben zu
    lassen und erst in einer zweiten Abfrage diese DS zu filtern.
    Wenn das etwas bringt, wäre die GesamtSQL-Anweisung zu optimieren.
    Oder du hast einen der Fälle, in denen Jet suboptimiert (Joins, Subquerys).
     
    Marsu65, 8. Juni 2015
    #10
  11. 1) Indizes haben und nutzen: Grundlagen - SQL ist leicht (8) - Index
    2) Die Abfrage so formulieren, dass der Jet-Optimierer besser optimieren kann. Bspw. ist ein JOIN aufwändiger als eine einfache Filterung (bei Berücksichtigung von 1) ). Daher könnte man eine gefilterte Tabelle (= Abfrage) in der neuen Abfrage joinen statt erst joinen und dann filtern.

    Die werden auch alle in dieser Abfrage benötigt?
    Schmale und flache Recordsets (schnellstmögliche Beschränkung auf die nur notwendigen Daten) dienen der Performance.
     
    ebs17, 8. Juni 2015
    #11
  12. Hallo Josef,

    hier der SQL-Code:

    Code:
    Muss ich mit dem Showplan-Tool noch was machen? Wenn ich es starte und dann die Abfrage ausführe, passiert nichts.

    Alles Andere dann morgen.

    Steffen
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    Toffel13, 8. Juni 2015
    #12
  13. Beschleunigung einer Abfrage

    Eine lesbar formatierte Form sieht anders aus. *rolleyes.gif*

    Beim Überfliegen:
    Da deine Kriterien nur die Tabelle tblArbeitsleistungen betreffen, solltest du
    diese vor dem Joinen vorfiltern
    ... Inner Join (SELECT x,y FROM tblArbeitsleistungen) ...
     
    Marsu65, 8. Juni 2015
    #13
  14. Hallo!

    Möglicherweise ist der Join-Ausdruck durch die Klammern etwas ungünstig für den Jet-Abfrageoptimierer.

    Versuche einmal die Abfrage neu aufzubauen, indem du mit dem Einfügen der tblArbeitsleistungen-Tabelle startest und von dort ausgehend alle anderen Tabellen verbindest. .. Damit als Ergebnis die Tabelle tblArbeitsleistungen "außen" im Join-Block steht.

    Weiters könntest du ausprobieren, ob es hilft, wenn du die anderen Tabellen mit left join verknüpftst - natürlich nur dann, wenn es das Ergebnis nicht beeinflusst.
    BTW: Tabellen!Feld ist für SQL unüblich. Normalerweise schreibt man Tabelle.Feld.

    Bezüglich Ausführungsplan: Damit der neu erstellt wird, musst du entweder die Datenbank komprimieren oder die Abfrage ändern.


    @Marsu und ebs: Das Vorfiltern einer Tabelle für einen Join bringt bei Jet etwas? Ist der Abfrageoptimierer wirklich so schlecht, dass er das nicht von selbst kann? *wink.gif*

    Ich würde bei folgendem Beispiel immer den gleichen Ausführungsplan erwarten (vermutlich arbeite ich schon zu lange mit T-SQL *wink.gif*):
    Code:
    @Steffen: im obigen Beispiel könnte ein 2-Felder-Index in der Tabelle T2 über xxx und fiT1 helfen.

    Zum Ausprobieren wäre dann auch, ob so etwas hilft:
    Damit sollte Jet mit dem Filter der Tabelle 2 beginnen und erst an dieses Ergebnis die T1 verbinden.

    mfg
    Josef
     
    Josef P., 8. Juni 2015
    #14
  15. Hallo Marsu,

    habe ich jetzt ausprobiert. Die Abfrage ohne die Filter dauert weniger als 1 sec. Die Filter-Abfrage dauert genauso lange wie die ursprüngliche (ca. 1 min).
    Heißt das, die Abfrage ist nicht wirklich über SQL optimierbar?

    ----

    Es war gestern schon spät. Zudem weiß ich nicht, wie SQL-Code normalerweise gegliedert wird. Deshalb habe ich den Code aus Access rüberkopiert. Er ist wie gesagt nicht direkt von mir geschrieben, sondern durch Access mit den Angaben aus dem Abfrage-Editor. Daher auch die Tabelle!Feld-Anweisungen.

    Hier erst mal der SQL-Code noch mal gegliedert:

    Code:
    Grüße
    Steffen
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    Toffel13, 8. Juni 2015
    #15
Thema:

Beschleunigung einer Abfrage

Die Seite wird geladen...
  1. Beschleunigung einer Abfrage - Similar Threads - Beschleunigung Abfrage

  2. Suchfunktion beschleunigen

    in Microsoft Word Hilfe
    Suchfunktion beschleunigen: Hallo, ich habe ein sehr großes Word-Dokument in dem ich sehr oft suche. Die Suche starte ich i.d.R. vom Anfang des Dokuments weil ich dann sehr häufig eine Fundstelle direkt im Inhaltsverzeichnis...
  3. Word beschleunigen bei großen Dokumenten

    in Microsoft Word Hilfe
    Word beschleunigen bei großen Dokumenten: Hallo, obwohl ich einen recht schnellen Rechner mit 16 GB RAM habe, kommt Word 2019 bei einem sehr großen Dokument (500 S.) an seine Grenzen. Beispielsweise erscheinen die Buchstaben beim tippen...
  4. Beschleunigung von Arrayformeln

    in Microsoft Excel Hilfe
    Beschleunigung von Arrayformeln: Hallo Community, ich habe eine Datei in Excel 2016 (dienstlich) erstellt, in der die Berechnungen vermutlich durch Nutzung von Arrayformeln sehr langsam durchgeführt werden. Privat nutze ich...
  5. Beschleunigen des ROI mit Business Intelligence

    in Microsoft Excel Tutorials
    Beschleunigen des ROI mit Business Intelligence: Beschleunigen des ROI mit Business Intelligence Excel 2019 Excel 2016 Mehr... Weniger Die Analyse von...
  6. Ladezeiten Webbrowsersteuerelement beschleunigen.

    in Microsoft Access Hilfe
    Ladezeiten Webbrowsersteuerelement beschleunigen.: Hallo , Und danke für die Aufnahme in dieses Forum. Nun zu meiner Frage. In einem Formular verwende ich ein Webbrowsersteuerelement um ein Pdf Dokument anzuzeigen. Der Pfad zu der Datei wird aus...
  7. Ativitätensuche in Kontakt beschleunigen

    in Microsoft Outlook Hilfe
    Ativitätensuche in Kontakt beschleunigen: Ich verwende Outlook 2010 auf einem älteren Notebook. Habe ca. 6.000 Kontakte drinnen. Ich öffne einen Kontakt. Klicke im Ribbon auf "Aktivitäten" Wähle bei Anzeigen "E-Mail" Im Fenster wird...
  8. Verweis Formel entschlacken und beschleunigen

    in Microsoft Excel Hilfe
    Verweis Formel entschlacken und beschleunigen: Hey Leute, da ich mal wieder mit Excel-Tabellen um mich schmeiße, bin ich leider wieder an ein Problem gestoßen wo die Hardware nicht so richtig hinterher kommt! Ich habe zwei Listen wobei ich...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden