none
SQL-Abfrage in VB6 dauert sehr lange RRS feed

  • Frage

  • Hallo,

    folgende SQL-Abfrage über 3 Tabellen dauert ungefähr 2 Minuten:

    SQL_Befehl = "SELECT DISTINCT Kostenstellen.Kostenstelle AS KSt_ID, Kostenstellen.Name AS KSt_Name " & _

                       " FROM Kostenstellen, Bereichszuordnung_der_KSt " & _

                       "WHERE Bereichszuordnung_der_KSt.Kostenstelle = Kostenstellen.Kostenstelle  " & _

                        "AND (Sperrkennzeichen IS NULL OR Sperrkennzeichen = ' ' OR Sperrkennzeichen = '1'  OR Sperrkennzeichen = '2'  OR Sperrkennzeichen = '3'  OR Sperrkennzeichen = '4'  OR Sperrkennzeichen = '5'  OR Sperrkennzeichen = '6'  OR Sperrkennzeichen = '7'  OR Sperrkennzeichen = '8' OR Sperrkennzeichen = '9'  )" & _

                       "AND (Bereichszuordnung_der_KSt.Bereich >= " & Von_Bereich & _

                       " AND Bereichszuordnung_der_KSt.Bereich <= " & Bis_Bereich & _

                       " )" & _

                       "AND Bereichszuordnung_der_KSt.Bereich IN (SELECT DISTINCT Bereichszuordnung_der_KSt.Bereich " & _

                       "FROM Bereichszuordnung_der_KSt, Aussenstellenzuordnung WHERE (Aussenstellenzuordnung.Aussenstelle >= " & _

                         Von_Aussenstelle & _

                       " AND Aussenstellenzuordnung.Aussenstelle <= " & _

                         Bis_Aussenstelle & _

                       " ) AND Aussenstellenzuordnung.Bereich = Bereichszuordnung_der_KSt.Bereich) "

       

    RS_Kostenstellen_der_Bereiche_Nr.Open _SQL_Befehl, cnDatenBank, adOpenStatic, adLockOptimistic

    Kann die Abfrage durch Optimierung der SQL-Befehlzeile beschleunigt werden? Oder liegt es an der Datenmenge, es werden circa 4000 Sätze gefunden?

    Sage jetzt schon mal vielen Dank für einen hilfreichen Tipp.

    Gruß

     

     

    Freitag, 1. Juli 2011 19:33

Antworten

  • Hallo Adam,

    welche RDBMS wird den verwendet? Wieviele Datensätze gefunden werden, ist fast nebensächlich, das hat nur Einfluß auf den Netzwerkverkehr. Wieviele Datensätze sind den in den Basistabellen? Wenn es ein paar hundert Million sind, würde ich fast sage, ist ok.

    Gibt es den geeignete Indizes, die für die Abfrage genutzt werden können und hast Du mal den Ausführungsplan geprüft, ob es dort "Schwachstellen" gibt?

    Das Distinct bei ...KSt.Bereich IN (SELECT DISTINCT Bereichszuordnung_der_KSt.Bereich... kannst Du Dir eigentlich&vermutlich sparen, das verursacht nur eine Sort Operation und die sind in der Regel teuer. 

    P.S.: Besser SQL Statements nicht dynamisch zusammen bastelt, verwende lieber parametrisierte Abfragen, siehe Beispiel: http://support.microsoft.com/kb/181734


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Samstag, 2. Juli 2011 04:55

Alle Antworten

  • Hallo Adam,

    welche RDBMS wird den verwendet? Wieviele Datensätze gefunden werden, ist fast nebensächlich, das hat nur Einfluß auf den Netzwerkverkehr. Wieviele Datensätze sind den in den Basistabellen? Wenn es ein paar hundert Million sind, würde ich fast sage, ist ok.

    Gibt es den geeignete Indizes, die für die Abfrage genutzt werden können und hast Du mal den Ausführungsplan geprüft, ob es dort "Schwachstellen" gibt?

    Das Distinct bei ...KSt.Bereich IN (SELECT DISTINCT Bereichszuordnung_der_KSt.Bereich... kannst Du Dir eigentlich&vermutlich sparen, das verursacht nur eine Sort Operation und die sind in der Regel teuer. 

    P.S.: Besser SQL Statements nicht dynamisch zusammen bastelt, verwende lieber parametrisierte Abfragen, siehe Beispiel: http://support.microsoft.com/kb/181734


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Samstag, 2. Juli 2011 04:55
  • Hallo Olaf,

    Vielen Dank für die Antwort.

    Es wird eine Access-Datenbank eingesetzt.

    Die Tabellen die in dem Statement angesprochen werden: Tabelle Kostenstellen mit dem Feld Kostenstelle als Primary Key; Tabelle Bereichszuordnung_der_KSt mit den Felder Kostenstelle und Bereich als zusammengesetzter Index (Primary Key) - ansonsten keine weiteren Indizes; Tabelle Aussenstellenzuordnung mit den Felder Bereich und Aussenstelle als zusammengestezter Index (Primary Key), die Felder Bereich und Aussenstelle sind jeweils auch Indízes.

    Die Tabelle Bereichszuornungen_der_KSt enthält circa 10000 Sätze, die anderen weniger.

    Gruß

    Adam

     

     

     

    Montag, 4. Juli 2011 08:10
  • Hallo,

    es war das "DISTINCT" bei

     ...KSt.Bereich IN (SELECT DISTINCT Bereichszuordnung_der_KSt.Bereich... das so zeitaufwendig ist.

    Sorry, weil ich so spät eine Rückmeldung gebe, konnte mich aber erst die Tage wieder mit dem Problem befassen.

    Danke.

    Grruß

    Adam

    Montag, 1. August 2011 14:40