Sie können eine dieser beiden Abfragen verwenden, um die gesamten logischen Lesevorgänge und die gesamten physischen Lesevorgänge anzuzeigen.
SELECT DB_NAME(st.dbid) Db,
OBJECT_NAME(st.objectid, st.dbid) Prc,
qs.execution_count,
qs.total_logical_reads,
qs.total_physical_reads,
qs.statement_start_offset,
qs.statement_end_offset,
st.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;
SELECT DB_NAME(database_id) Db,
OBJECT_NAME(object_id, database_id) Prc,
execution_count,
total_logical_reads,
total_physical_reads
FROM sys.dm_exec_procedure_stats ps;
Der erste zerlegt dies nach Aussage, der zweite zählt im gesamten Verfahren.
Physische Lesevorgänge beziehen sich auf die Festplatte, logische Lesevorgänge auf den Speicher. Auf diese Weise können Sie herausfinden, welche Prozeduren oder Anweisungen in Ihrem System am teuersten sind, und versuchen, diese zu optimieren.
Denken Sie daran, dass logische Lesevorgänge zwar erheblich billiger als physische Lesevorgänge sind, sie jedoch immer noch teuer. Wenn Sie also die Anzahl der Lesevorgänge verringern (z. B. durch Hinzufügen eines entsprechenden Index), können Ihre Abfragen erheblich schneller ausgeführt werden.
Es gibt viele zusätzliche Spalten in den DMVs darüber, die Sie vielleicht auch interessieren.
Wie hilft ein Index, logische Lesevorgänge zu reduzieren?
In SQL Server sind alle Daten in Blöcken mit einer Größe von 8 KB organisiert. Diese Blöcke werden "Seiten" genannt.
Jede Tabelle enthält "Meta" -Seiten, die Informationen zur Struktur der Tabelle enthalten, sowie Pata-Seiten. Wenn kein Index vorhanden ist und Sie eine Abfrage wie SELECT * FROM tbl WHERE Id = 7
SQL Server ausführen , müssen Sie nach dieser oder diesen Zeilen in der gesamten Tabelle suchen. Es liest also jeweils eine Seite nach der anderen und durchläuft alle Zeilen auf jeder Seite, um die Zeilen zu bestimmen, die in die WHERE
Klausel passen . Wenn für die Tabelle 1.000.000 Seiten gespeichert werden müssen, erfordert diese Abfrage 1.000.000 logische Lesevorgänge.
Wenn Sie einen Index haben, sortiert SQL Server die Daten logisch innerhalb der Seiten und erstellt eine verknüpfte Liste zwischen den Seiten. Auf diese Weise können Abfragen ORDER BY
ausgeführt werden, ohne dass eine teure Sortieroperation erforderlich ist. Wichtig ist jedoch, dass SQL Server beim Sortieren der Tabelle einen B + Tree hinzufügt . Ein B + Tree ist eine Struktur, die mit dem Index in einem Buch vergleichbar ist. Durch die Suche nach einem bestimmten Schlüsselwort kann ich direkt zu der Seite springen, die das Schlüsselwort enthält. Das typische Buch hat nur eine Indexstufe, während ein B + Tree mehrere haben kann. Stellen Sie sich ein großes Buch vor, in dem der Index selbst mehrere Seiten umfasst. In einem solchen Fall ist es sinnvoll, eine zusätzliche Indexebene hinzuzufügen, die angibt, auf welcher Seite die Indexwörter S
zu finden sind, die mit beginnen .
B + Trees sind so optimiert, dass sie so wenige Ebenen wie möglich haben. Gleichzeitig wird die Eigenschaft bereitgestellt, dass jeder Datensatz im Index gefunden werden kann, indem eine Seite pro Indexebene gelesen wird. WHERE Id = 7
Nehmen Sie also die obige Abfrage an, wenn Sie einen Index haben, der nach sortiert ist Id
. Angenommen, der Index hat 5 Ebenen. Um nun alle Datensätze zu finden, die dieser Abfrage entsprechen, muss ich eine Seite pro Indexebene (das sind 5 Seiten) lesen. Dies wird als "Indexsuche" bezeichnet. Wenn mehrere Datensätze zur Rechnung passen, muss ich möglicherweise eine Weile dem sortierten Index folgen, um alle abzurufen. Nehmen wir jedoch an, dass es nur einen Datensatz gibt.
Ohne den Index, der diese Abfrage ausführt, waren 1.000.000 Lesevorgänge erforderlich, mit indes waren 5 Lesevorgänge erforderlich. Auch wenn ein logischer Lesevorgang ein Vorgang im Speicher ist, sind die Kosten dennoch beträchtlich. Tatsächlich ist er der teuerste Vorgang in einer einfachen Abfrage wie der oben beschriebenen. Wenn Sie also die Anzahl der erforderlichen logischen Lesevorgänge um den Faktor 200.000 verringern, wird Ihre Abfrage um einen ähnlichen Faktor beschleunigt.
Ein logischer Lesevorgang entspricht also nicht einem Tabellenscan, aber ein Tabellenscan führt zu sehr viel mehr logischen Lesevorgängen als eine Indexsuche.
Sie können SQL Profiler verwenden. Wenn Sie den Trace starten, sollten Sie RPC Completed, SP Starting, SP StmtStarting und SP StmtCompleted auswählen (siehe Abbildung unten).
Auf diese Weise können Sie jede Abfrage anzeigen, die in gespeicherten Prozeduren ausgeführt wird. Sie können sehen, wie oft eine verschachtelte gespeicherte Prozedur aufgerufen wird. Wenn der Trace beendet ist, sollten Sie ihn speichern. Öffnen Sie es dann erneut. Anschließend können Sie (mit der Schaltfläche "Spaltenfilter") filtern, um die Abfragen zu finden, die Ihr Problem verursachen. (Beispiel: die Abfragen, die mehr als x Lesevorgänge oder mehr als x Sekunden dauerten (Dauer) ...)
Die von mir gezeigten Profiler-Optionen zeigen auch den Ausführungsplan, was auch sehr hilfreich ist.
quelle
Es scheint eine allgemeine Frage zur Abfrageoptimierung zu sein. Nach Ihrer Beschreibung würde ich:
quelle