Sind sich Datenbankabfrageoptimierer der Unterschiede in der Speicherleistung bewusst?

8

Soweit ich weiß, ist sich der Abfrageoptimierer in SQL Server (oder einem anderen RDBMS) der Leistung des Speichers unter der Datenbank nicht bewusst und trifft Entscheidungen, als ob der gesamte Speicher die gleichen Kosten verursacht. Ist das richtig oder gibt es Kenntnisse über die Speicherleistung, die berücksichtigt werden?

Nehmen wir in einem völlig erfundenen Beispiel an, dass meine Tabellenzeilen auf einem SSD-Laufwerk in meinem SAN mit sofortigen Zugriffszeiten gespeichert werden, wobei meine Indizes auf SAS-Laufwerken gespeichert werden, die extrem überlastet sind, was zu Festplattensättigung und konstanten Festplattenwarteschlangen führt. Wenn das RDBMS den Ausführungsplan generiert, ist es dann wahrscheinlicher, dass ein Tabellenscan bevorzugt wird als eine Indexoperation (oder möglicherweise ein dünner Index und zugehörige Tabellensuchen im Gegensatz zu einem abdeckenden Index, da auf den SAS-Datenträgern weniger E / A vorhanden sind)?

Ich vermute, die Antwort ist solide: "Keine Chance ist der Optimierer, der intelligent ist oder sich sogar der Festplattenleistung bewusst ist", aber ich wollte nur sehen, ob jemand da draußen es sicher weiß. Ich verwende SQL Server, interessiere mich aber für jedes Datenbanksystem.

SqlRyan
quelle
1
Der Optimierer von MySQL ist sich ebenfalls nicht bewusst. Der Speicher kann eine Festplatte, eine SSD, eine Netzwerk-über-33,6-Kbit / s-Verbindung sein. Optimierer hat keine Ahnung.
Ypercubeᵀᴹ
3
Oracle generiert "Systemstatistiken", die (unter anderem) die Latenz (und Leistung) des Festplattenzugriffs messen und diese Werte in den Plan aufnehmen. Für Postgres können Sie manuell eine Skala festlegen, wie "teuer" bestimmte E / A-Vorgänge sind, die auch vom Planer verwendet werden.
a_horse_with_no_name

Antworten:

8

Das Abfrageoptimierungsprogramm des SQL-Servers berücksichtigt beim Kompilieren eines Abfrageplans keine Unterschiede in der Festplattenleistung. Paul White bietet hier einen großartigen Überblick über den kostenbasierten Optimierer von Sql Server:

https://sqlkiwi.blogspot.com/2010/09/inside-the-optimizer-plan-costing.html

Einige wichtige Punkte sind:

  • Der Optimierer versucht nicht, die genauen Kosten eines Plans zu berechnen. Es wird versucht, den Plan mit den relativ niedrigsten Kosten zwischen mehreren Alternativen auszuwählen.

  • Es ist eine vereinfachte Sicht der Realität. Es wird davon ausgegangen, dass ein Server 320 io / s leisten kann und dass die CPU-Leistung seit über einem Jahrzehnt nicht mehr gestiegen ist.

  • Obwohl Server heutzutage sehr unterschiedliche Leistungsmerkmale aufweisen, leistet der Optimierer in den meisten Fällen immer noch wirklich gute Arbeit.

Warum fügt Microsoft dem Optimierer keine zusätzlichen Informationen hinzu? In Zukunft könnten jedoch kleinere Änderungen der Kosten einzelner Iteratoren wahrscheinlicher sein. Derzeit ist der Nutzen nicht da, um den Aufwand zu rechtfertigen.

Sie können undokumentierte dbcc-Aufrufe verwenden, um einige der Annahmen des Abfrageoptimierers zu ändern. VERWENDEN SIE DIESE NICHT AUF EINEM PRODUKTIONS-SERVER

DBCC SETIOWEIGHT(<multiplier>)
DBCC SETCPUWEIGHT(<multiplier>)

Beide haben Standardwerte von 1. Spielen Sie mit ihnen und prüfen Sie, ob Sie unterschiedliche Werte finden können, die in den meisten Fällen durchweg bessere Pläne ergeben. Sie werden feststellen, dass kleine Änderungen die meisten Pläne nicht ändern und große Änderungen wirklich bizarre Pläne erzeugen.

Ein weiterer Punkt ist, dass SQL beim Kompilieren eines Plans zwar die Io-Leistung nicht berücksichtigt, jedoch während der Ausführung des Plans auf die Io-Leistung reagiert (Einschränkung der Vorauslesungen, wenn Io gesättigt ist usw.)

StrayCatDBA
quelle
Das sind großartige Informationen - danke! Es bestätigt den Verdacht, den ich hatte, und es hat Spaß gemacht, mit diesen beiden DBCC-Befehlen auf einer Sandbox-Maschine zu spielen, die ich habe :)
SqlRyan
0

Das Db2 for LUW-Abfrageoptimierungsprogramm kennt die Hardwareleistungsmerkmale des Computers, auf dem es ausgeführt wird, und berücksichtigt sie.

Insbesondere verfügt jeder Tabellenbereich über zwei numerische Parameter, die die zugrunde liegende Speicherleistung widerspiegeln: overheadDies spiegelt den Overhead des E / A-Controllers und die Such- und Latenzzeit der Festplatte in Millisekunden wider und transferrategibt die Zeit an, die zum Übertragen einer Tabellenbereichsseite von der Festplatte in den Speicher erforderlich ist.

Diese Parameter können zum Zeitpunkt der Erstellung des Tabellenbereichs angegeben werden, um heuristisch abgeleitete Standardwerte zu überschreiben.

Die E / A-Leistungsparameter werden zusammen mit dem Parameter auf cpu_speedDatenbankmanagerebene vom Optimierer verwendet, um die E / A- und CPU-Kosten jedes Abfrageplanoperators zu berechnen, und wirken sich daher darauf aus, welcher Plan letztendlich ausgewählt wird. Anschließend wäre Ihr Szenario in Db2 völlig plausibel. In ähnlicher Weise kann der Optimierer auf einem System mit sehr hoher CPU-Geschwindigkeit und mittelmäßiger Festplattenleistung CPU-intensive Operatoren (z. B. Tabellenscan plus Sortierung) gegenüber E / A-intensiveren Operatoren (z. B. indexbasierter Tabellenzugriff) bevorzugen.

Ich glaube, dass Db2 für z / OS in ähnlicher Weise die zugrunde liegenden Hardwareleistungsmerkmale berücksichtigt und diese von der Speicherverwaltungsschicht bezieht, nicht als Teil der Datenbankkonfiguration.

mustaccio
quelle