DCount/Recordset langsam

  • Access

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Bexlight.

    DCount/Recordset langsam

    Guten Morgen!

    Ich arbeite momentan mit einer Tabelle die mehr als 800.000 Datensätze besitzt.
    Ich muss die Anzahl der Datensätze mit einer bestimmten Belegnummer zählen.

    Anfangs tat ich das ganz einfach mit DLookup("[Feld]", "Tabelle", "Kriterium").
    Habe im Internet jedoch eine clevere Variante gefunden, die das ganze etwas zu beschleunigt:



    Visual Basic-Quellcode

    1. Function fcDomWert(Expression As String, Domain As String, _
    2. Optional Criteria As String, _
    3. Optional ltDomArt As ltDomWert = ltDLookup) As Variant
    4. Dim strSQL As String
    5. Dim rs As DAO.Recordset
    6. Select Case ltDomArt
    7. Case 0: strSQL$ = "SELECT " & Expression$ & " FROM " & Domain$
    8. Case 1: strSQL$ = "SELECT COUNT(" & Expression$ & ") FROM " & Domain$
    9. Case 2: strSQL$ = "SELECT MAX(" & Expression$ & ") FROM " & Domain$
    10. Case 3: strSQL$ = "SELECT MIN(" & Expression$ & ") FROM " & Domain$
    11. Case 4: strSQL$ = "SELECT FIRST(" & Expression$ & ") FROM " & Domain$
    12. Case 5: strSQL$ = "SELECT LAST(" & Expression$ & ") FROM " & Domain$
    13. Case 6: strSQL$ = "SELECT SUM(" & Expression$ & ") FROM " & Domain$
    14. Case 7: strSQL$ = "SELECT AVG(" & Expression$ & ") FROM " & Domain$
    15. End Select
    16. If Nz(Criteria$, "") <> "" Then strSQL$ = strSQL$ & " WHERE " & Criteria$
    17. Set rs = CurrentDb.OpenRecordset(strSQL$, dbOpenForwardOnly)
    18. If rs.EOF Then
    19. fcDomWert = Null
    20. Else
    21. fcDomWert = rs.Fields(0)
    22. End If
    23. ' Debug.Print fcDomWert 'Nur zum Testen
    24. rs.Close
    25. Set rs = Nothing
    26. End Function

    Ist mir dennoch etwas zu langsam.
    Das Feld Belegnummer ist indiziert.

    Hat jemand von euch eine Idee, was sich da noch machen lässt?

    Grüße Bexlight

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bexlight“ ()

    Bexlight schrieb:

    Hat jemand von euch eine Idee, was sich da noch machen lässt?

    Du weißt schon, dass Access für solche Datenmengen i.A. nicht der Oberknaller ist?

    btw: "langsam" ist relativ. Reden wir über ms oder min ?

    BTW: In den meisten Fällen dürfte
    SELECT Count(*) FROM Tabelle WHERE Feld = Wert
    SCHNELLER sein als
    SELECT Count(Feld) FROM Tabelle WHERE Feld = Wert

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()

    picoflop schrieb:


    Du weißt schon, dass Access für solche Datenmengen i.A. nicht der Oberknaller ist?


    Naja, lässt sich in der momentanen Situation leider nicht ädern.


    btw: "langsam" ist relativ. Reden wir über ms oder min ?


    30-40 Sekunden im Schnitt.

    BTW: In den meisten Fällen dürfte
    SELECT Count(*) FROM Tabelle WHERE Feld = Wert
    SCHNELLER sein als
    SELECT Count(Feld) FROM Tabelle WHERE Feld = Wert


    Ist eine gute Idee, war mir gar nicht aufgefallen.


    Eine weitere Sache die sich in die Länge zieht ist das Finden des ersten Datensatzes, auf den die Kriterien zutreffen.
    Die eigentlichen Daten die ich benötige liegen in den letzten 20.000 Datensätzen der Tabelle, da vorherige Daten bereits verarbeitet und verändert wurden und für meine Funktion nicht relevant sind.
    D.h. er durchsucht die ersten 700.000+ Datensätze obwohl ich weis, dass er kein Ergebnis finden wird.
    Kann man ihm nicht eine exakte Position (bspw. Datensatz #700.000) mitgeben, an die er sich begibt bevor ich ihn mit FindFirst auf die Suche nach bestimmten Datensätzen schicke? MoveLast & FindPrevious sind hier leider keine Option; ist nicht umsetzbar.

    Grüße Bexlight

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bexlight“ ()