Announcement

Collapse
No announcement yet.

Dauer einer SQL-Abfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dauer einer SQL-Abfrage

    Hallo,
    ich habe schon im Internet recherchiert, aber leider bin ich nicht so richtig fündig geworden.
    Folgende Frage:
    Wenn ich das relat. DB-Modell verwende und die 3. NF umgesetzt habe, so verknüpfe ich meine einzelnen Tabellen ja über Zwischentabellen, welche die Primär- und Fremdschlüssel miteinander verbindet. Der entsprechende SQL-Befehl enthält somit ja mehrere JOIN-Anweisungen. Da ich nun nicht nur 2 Tabellen verknüpft habe sondern mehrere wollte ich fragen, ob es eine Formel zur Berechnung der Dauer einer Abfrage gibt? Solange ich wenige Datensätze pro Tabelle habe mag es ja gehen, aber wenn dann pro Tabelle bspw. 1 Mio. Datensätze sind und ich 5 Tabellen in einer verknüpfe dann würde ich gern berechnen, wie lange dann eine Abfrage dauert. Nicht dass man am Ende dann eine halbe Minute dafür warten muss.
    Gibt es da eine Formel?
    Danke schonmal!

  • #2
    Welche Datenbank?
    Welche Hardware/Server?
    Christian

    Comment


    • #3
      Gibt es da eine Formel?
      Vielleicht. Aber sicher keine die mehr als akademischen Werte hätte da die Anzahl Parameter viel zu hoch wären und viele von denen nicht so einfach zu ermitteln sind. Ausprobieren und intelligent hoch rechnen ist wahrscheinlich einfacher, genauer und man hat schneller ein Ergebnis.

      Comment


      • #4
        Danke für die Antworten!
        Zum Modellieren habe ich nur eine Access-DB verwendet, später wird ein SQL Server die Arbeit übernehmen.
        Eine Zeitangabe muss nicht unbedingt gemacht werden, die Anzahl der Operationen würde erstmal schon reichen. Funktioniert es denn, einfach die Anzahl der Datensätze aller (verknüpften) Tabellen zu multiplizieren?
        Mal als abstraktes Beispiel:
        4 Tabellen (eine davon verknüpfend):
        1. Tabelle "Auto": $ID, Marke
        2. Tabelle "Farben": $ID, Farbe, Kürzel
        3. Tabelle "Motor": $ID, PS, Hubraum
        4. Tabelle "Übersicht": $ID, Automarke, Farbe, PS

        die ersten 3 Tabellen enthalten außer der ID (Integer) nur String-Werte. Die 4. Tabelle enthält nur Integer-Werte, die eine referenz auf die ID der anderen 3 Tabellen verweisen.
        Angenommen Tabelle 1 enthält: 1, Audi; 2, VW; 3, Volvo
        Tabelle 2 enthält: 1, rot, r; 2, blau, b; 3, grün, g
        Tabelle 3 enthält: 1, 75, 1400; 2, 119, 1800;
        Tabelle 4 enthält: 1, 1, 1, 1; 2, 2, 2, 2; 3, 3, 2, 2
        Tabelle 4 soll mir ja nun nicht die Zahlen sondern die Strings wiedergeben also
        1, Audi, rot, 75ps; 2, VW, blau, 119ps; 3, Volvo, blau, 119ps

        Kann man da jetzt berechnen, wieviele Operationen daüfr notwendig sind?

        Comment


        • #5
          Definiere was in diesem Zusammenhang 'Operation' bedeuten soll.

          Comment


          • #6
            Habe eigentlich auf m.E. zwei wichtige Punke hingewiesen. Es kommt darauf an, mit welcher DB und auf welcher Hardware das läuft.

            Dann erstelle eine Testversion, die 10, 100 oder xx mal die Datenbankabfrage tätigt. Dann rechne das hoch...
            Christian

            Comment


            • #7
              Operation in dem Zusammenhang wären sozusagen die Vergleiche. Bei der Abfrage im Bsp. würde ja vereinfacht gesagt zuerst die Tabelle Autos durchlaufen und solange gesucht, bis die ID aus Tabelle Übersicht gefunden würde. Genau dann so mit Farbe und Motor.
              Hätte jede Tabelle 1000 Datensätze und man ginge vom Worst-Case aus (also die gesuchte ID befindet sich am Ende der Tabelle) wären das ja 1000*1000*1000 Operationen, oder nicht?

              Comment


              • #8
                Das sind Gedanken, die sich die Entwickler einer DB machen müssen.
                Des Weiteren gibt es dazu Indexfelder, die die Suche beschleunigen usw. Für die Suche selbst werden die Entwickler wohl keine lineare Suche implementiert haben

                http://de.wikipedia.org/wiki/Suchstrategie
                Christian

                Comment


                • #9
                  Selbst MS Access wird man wahrscheinlich nicht so eingestellt bekommen das es so naiv vorgeht(Indizes weglassen, Primary Keys weglassen, irgendwie Verhindern das die Datenbank selbst die günstigste Tabelle zum anfangen auswählt etc. etc.).

                  Wenn eine Datenbank so vorgehen würde wäre deine Rechnung übrigens nur dann richtig wenn du 1000 absolut identische Autos hättest und dann noch in den 3 anderen Tabellen jeweils 999 überflüssige Datensätze.

                  Comment


                  • #10
                    Originally posted by Nayko View Post
                    Operation in dem Zusammenhang wären sozusagen die Vergleiche. Bei der Abfrage im Bsp. würde ja vereinfacht gesagt zuerst die Tabelle Autos durchlaufen und solange gesucht, bis die ID aus Tabelle Übersicht gefunden würde. Genau dann so mit Farbe und Motor.
                    Hätte jede Tabelle 1000 Datensätze und man ginge vom Worst-Case aus (also die gesuchte ID befindet sich am Ende der Tabelle) wären das ja 1000*1000*1000 Operationen, oder nicht?
                    Ich beziehe mich jetzt mal auf Oracle:
                    Die Tabellen werden der Reihe nach verknüpft, der Worst-Case ist natürlich 1000*1000*1000 aber wenn die beiden ersten Tabellen weniger als 1000*1000 Datensätze liefern, wird die dritte Runde kleiner. Anders ausgedrückt: Wenn A und B nicht übereinstimmen muss ich (A und B) und C nicht mehr überprüft weil die Ergebnismenge immer leer ist.

                    Es kommt ausserdem darauf an wie die Datenbank die Tabellen verbindet. Bei einem "Nested-Join" wird es so gemacht wie oben von dir angedeutet. Bei einem "Hash-Join" wird es anders gemacht, da fallen bereits vorher Datensätze raus, bzw. müssen nicht mehr verglichen werden weil klar ist, dass es keine Übereinstimmung geben kann.

                    Man kann nicht pauschal sagen wie die Tabellen verbunden werden weil es nicht nur durch deren Aufbau bestimmt wird (es sei denn du verwendest den Rule Based Optimizer RBO, der ist aber veraltet), sondern auch durch die Daten in den Tabellen. Es gibt durchaus Situationen in denen es schneller ist, einen Index nicht zu lesen.

                    Deine Frage ist nicht so einfach zu beantworten, das Buch Cost-Based Oracle Fundamentals hat über 500 Seiten und beschäftigt sich nur mit diesem einem Thema.

                    Gruss

                    Comment

                    Working...
                    X