Thema Datum  Von Nutzer Rating
Antwort
Rot Schlechte Performance
14.02.2012 14:43:42 Bexlight
NotSolved
15.02.2012 02:56:35 Till
Solved
15.02.2012 09:51:11 Gast14564
NotSolved
15.02.2012 12:20:16 Till
NotSolved

Ansicht des Beitrags:
Von:
Bexlight
Datum:
14.02.2012 14:43:42
Views:
1772
Rating: Antwort:
  Ja
Thema:
Schlechte Performance

 

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:
 
 
Function fcDomWert(Expression As String, Domain As String, _
                   Optional Criteria As String, _
                   Optional ltDomArt As ltDomWert = ltDLookup) As Variant
    Dim strSQL  As String
    Dim rs      As DAO.Recordset
    
    Select Case ltDomArt
      Case 0: strSQL$ = "SELECT " & Expression$ & " FROM " & Domain$
      Case 1: strSQL$ = "SELECT COUNT(*) FROM " & Domain$
      Case 2: strSQL$ = "SELECT MAX(" & Expression$ & ") FROM " & Domain$
      Case 3: strSQL$ = "SELECT MIN(" & Expression$ & ") FROM " & Domain$
      Case 4: strSQL$ = "SELECT FIRST(" & Expression$ & ") FROM " & Domain$
      Case 5: strSQL$ = "SELECT LAST(" & Expression$ & ") FROM " & Domain$
      Case 6: strSQL$ = "SELECT SUM(" & Expression$ & ") FROM " & Domain$
      Case 7: strSQL$ = "SELECT AVG(" & Expression$ & ") FROM " & Domain$
    End Select
    If Nz(Criteria$, "") <> "" Then strSQL$ = strSQL$ & " WHERE " & Criteria$
    Set rs = CurrentDb.OpenRecordset(strSQL$, dbOpenForwardOnly)
    If rs.EOF Then
        fcDomWert = Null
      Else
        fcDomWert = rs.Fields(0)
    End If
'    Debug.Print fcDomWert 'Nur zum Testen
    rs.Close
    Set rs = Nothing
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?
 
Eine weitere Sache die sich in die Länge zieht ist das Finden des ersten Datensatzes, auf den bestimmte 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

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot Schlechte Performance
14.02.2012 14:43:42 Bexlight
NotSolved
15.02.2012 02:56:35 Till
Solved
15.02.2012 09:51:11 Gast14564
NotSolved
15.02.2012 12:20:16 Till
NotSolved