[MSSQL] Dauer/Laufzeitberechnung von Statements im

Hallo,
ich habe ein größeres Projekt für das ich die Laufzeiten von Statements im Voraus berechnen möchte. Die Statements werden über eine GUI zusammengeklickt und werden dadurch mitunter sehr komplex. Der User brauch daher eine grobe Zeitabschätzung über die Dauer, die er auf die Antwort warten muss. Sind es ein paar Sekunden, eine halbe Stunde oder doch eher ein paar Stunden.

Nun meine Frage:
Kennt jemand gute Quellen, mit deren Hilfe ich mich in das Thema einarbeiten könnte?
Alterativ würde ich natürlich hier eine kleine Diskussion anstoßen. Wovon hängt die Laufzeit eines Statements ab?

  • Anzahl der JOINs

  • Anzahl der unterschiedlichen beteiligten Tabellen

  • Größe der beteiligten Tabellen

  • Komplexität der WHERE-Bedingung („id=5“ oder eher „name LIKE ‚%foo%‘“)

  • Indizes

  • verwendete Hardware

Was wisst ihr noch, bzw. wie stark kann man die einzelnen Einflussfaktoren bewerten?

Über jede Hilfe dankbar,
Dominik

hi Dominik

also, ich arbeite hauptsächlich mit oracle, aber die grundkonzepte werden ähnlich sein…

die laufzeit ist im wesentlichen von der datenmenge abhängig, die von der platte in den hauptspeicher geladen werden muss. natürlich geht auch zeit für was anderes drauf aber im wesentlichen sind es die platten-ios, die eine anwendung in die knie zwingen.

sowohl zugriffe auf die tabelle selbst als auch auf den index benötigt io. das ist wichtig, weil manche leute glauben, dass ein index eine suche automatisch schneller macht. im extremfall kann aber ein index die ios verdoppelt und damit das eigentliche problem darstellen.

zusätzlich muss man zwischen physischen ios auf die platte (laaaaangsam) und ios auf hauptspeicher (schnell) unterscheiden.

ein index auf eine spalte, auf die mit „like ‚%text%‘“ zugegriffen wird, ist reichlich unnötig, da hierfür der index nicht genutzt werden kann. spalten mit null-werten werden normalerweise nicht in den index aufgenommen, suchen mit „where column is null“ nutzen also auch nicht den index.

ganz wichtig und gerne ignoriert/vergessen: bereits beim definieren der datenstrukturen sollte man schon ein auge auf die zukünftigen suchabfragen werfen. designs laut lehrbuch, die brav in der 4. normalform sind, sind für den praxiseinsatz ev. unbrauchbar weil zu langsam (was nicht heisst, dass designs niedriger normalität automatisch besser sind!).

es gilt also, datenstruktur, indizes und suchabfragen gemeinsam aufeinander abzustimmen. hier ist auch die meiste performance aus einer anwendung herauszuholen.

dann gilt natürlich meist die milchmädchenrechnung „je mehr ram desto schneller“ (nicht immer aber meistens).

solange joins „sauber“ sind und nicht zu exzessiv gemacht werden, müssten sie für die performance wenig auswirkung haben: relationale datenbanken sind ja genau für diesen zweck konstruiert worden. im oracle ist es allerdings so, dass der optimizer ab einer gewissen anzahl an beteiligten tabellen nur mehr grobe schätzungen abgibt, da er die kombinationen nicht mehr in vernünftiger zeit berechnen kann (optimieren des statements würde länger dauern als ein full-table-scan).

im oracle kann man ein statement vom optimizer analysieren lassen, ohne es ausführen zu müssen. man bekommt dabei u.a. eine grobe schätzung, wieviele daten verarbeitet werden müssen. damit kann man wenigstens halbwegs fundiert eine schätzung über die laufzeit abgeben. ob ms sql irgendwas ähnliches anbietet, weiss ich allerdings nicht.

ich fürche allerdings, dass du auf verlorenem posten stehst, wenn der benutzer beliebige suchabfragen absetzen darf. gerade die kombination verschiedener kriterien bewirkt manchmal einen massiven einbruch in der performance - das alles auszuwerten, ist nicht gerade einfach.

am ehesten kann man sich normalerweise mit einem heuristischen ansatz helfen: einfach mal ein paar suchen durchprobieren und die zeiten messen, die kriterien vom benutzer mit den tests vergleichen und bei ähnlichen suchen ähnliche ausführungszeiten annehmen. je nachdem, wie der benutzer die suchabfragen zusammenstellen kann, ist das entweder sehr einfach oder ein riesen aufwand.

lg
erwin

Hallo Erwin,
vielen Dank für deine ausführliche Antwort! Das ist mir schon mal eine große Hilfe!

im oracle kann man ein statement vom optimizer analysieren
lassen, ohne es ausführen zu müssen. man bekommt dabei u.a.
eine grobe schätzung, wieviele daten verarbeitet werden
müssen. damit kann man wenigstens halbwegs fundiert eine
schätzung über die laufzeit abgeben. ob ms sql irgendwas
ähnliches anbietet, weiss ich allerdings nicht.

Also ich bin jetzt auf was gestoßen.
Mit SET SHOWPLAN_XML ON kann man sich den Ablaufplan eines Statements zurückgeben lassen:
Auszug:

Ich finde aber nirgends eine vernünftige Auflistung der Elemente und Attribute mit Beschreibung.
Ich denke besonders interessant hört sich hier StatementSubTreeCost an. Gibt dieses Attribut eine Zeit an, wie lange die Abfrage laufen wird (vielleicht in Sekunden) oder was sagt mir die Zahl 0.0033205?

Kennt sich jemand damit aus? Es würde mir natürlich auch ein Link reichen, am besten aus dem msdn-Bereich, auf dem ich mich selber schlau machen kann.
Das Prinzip ist mir klar:
http://msdn2.microsoft.com/de-de/library/ms187757.aspx
Nur was bedeuten die ganzen Werte? Das muss doch irgendwo dokumentiert sein!

am ehesten kann man sich normalerweise mit einem heuristischen
ansatz helfen: einfach mal ein paar suchen durchprobieren und
die zeiten messen, die kriterien vom benutzer mit den tests
vergleichen und bei ähnlichen suchen ähnliche
ausführungszeiten annehmen. je nachdem, wie der benutzer die
suchabfragen zusammenstellen kann, ist das entweder sehr
einfach oder ein riesen aufwand.

Da die Berechnung erstmal nur für eine relativ klare Struktur von Statements gemacht werden soll, aber auf alle möglichen Queries und Datenbanken übertragbar sein soll werde ich um die Heuristik nicht herum kommen. Ich freu mich schon… Ahhhhh!

Vielen Dank soweit!
Dominik