Ausführungsplan in SQL Server 2000

Tech-Archive recommends: Fix windows errors by optimizing your registry

From: Ina Schmitz (web_at_inalein.net)
Date: 03/24/05


Date: Thu, 24 Mar 2005 10:21:32 +0100

Hallo zusammen,

ich lasse mir in SQL Server 2000 mit SET STATISTICS PROFILE ON den
tatsächlichen Ausführungsplan anzeigen.

Auch wenn er etwas lang ist, schicke ich ihn hier zur Beschreibung meiner
Fragen mal mit:
      Schritt 1: TABLE SCAN

     Physische Operation
     Table Scan

      Logische Operation
     Table Scan

      Zeilenanzahl
     5000

      Durchschnittliche Zeilenlänge
     298

      E/A-Kosten (geschätzt)
     0.17535628

      CPU-Kosten (geschätzt)
     5.5785002E-3

      Anzahl an Ausführungen
     1

      (Gesamte) Teilbaumkosten
     0.18093477

      Schritt 2: TABLE SPOOL
     Physische Operation
     Table Spool

      Logische Operation
     Lazy Spool

      Zeilenanzahl
     25000000

      Durchschnittliche Zeilenlänge
     290

      E/A-Kosten (geschätzt)
     1.26

      CPU-Kosten (geschätzt)
     9.0470002E-4

      Anzahl an Ausführungen
     5000

      (Gesamte) Teilbaumkosten
     248.25359

      Schritt 3: TABLE SCAN
     Physische Operation
     Table Scan

      Logische Operation
     Table Scan

      Zeilenanzahl
     5000

      Durchschnittliche Zeilenlänge
     298

      E/A-Kosten (geschätzt)
     0.17535628

      CPU-Kosten (geschätzt)
     5.5785002E-3

      Anzahl an Ausführungen
     1

      (Gesamte) Teilbaumkosten
     0.18093477

      Schritt 4: NESTED LOOPS
     Physische Operation
     Nested Loops

      Logische Operation
     Inner Join

      Zeilenanzahl
     7818

      Durchschnittliche Zeilenlänge
     582

      E/A-Kosten (geschätzt)
     0.0

      CPU-Kosten (geschätzt)
     104.5

      Anzahl an Ausführungen
     1

      (Gesamte) Teilbaumkosten
     385.43451

      Schritt 5: SELECT
     Physische Operation
     NULL

      Logische Operation
     NULL

      Zeilenanzahl
     7818

      Durchschnittliche Zeilenlänge
     NULL

      E/A-Kosten (geschätzt)
     NULL

      CPU-Kosten (geschätzt)
     NULL

      Anzahl an Ausführungen
     1

      (Gesamte) Teilbaumkosten
     386.18451

- Frage 1: Da es sich um eine Select-Anweisung handelt, die "einfach" einen
Selfjoin über eine Tabelle durchführt, muss also OHNE angelegte Indizes die
Tabelle für jeden möglichen Joinpartner einmal KOMPLETT durchlaufen werden.
Daher in Schritt 1+3 jeweils der Table Scan. Aus den Teilbaumkosten lese ich
raus, dass dieser Tablescan aber relativ "günstig" ist (0.18093477).
Dazwischen ist aber dann Schritt 2 (TABLE SPOOL) mit relativ hohen Kosten
von 248.25359 geschaltet. So wie ich das verstanden habe, dient ein Table
Spool nur der temporären Zwischenspeicherung. Was aber bringt mir der, wenn
er nur relativ "teuer" ist? Ginge es auch ohne den bzw. warum wird der
ausgeführt?
- Frage 2: Wie kommt man auf die Teilbaumkosten 385.43451 von NESTED LOOPS?
Warum berechnen sich die Teilbaumkosten nicht aus den Kosten für den TABLE
SCAN, also 5000*0.18093477 = 904.67?
- Frage 3: Um die Gesamtkosten der Anfrage zu ermitteln, genügt es, die
Summe der Teilbaumkosten über Schritt1-5 zu bilden?

Wäre sehr dankbar für Tipps, die Ausführungspläne von SQL Server zu
verstehen :-)

Viele Grüße
Ina