Ich habe eine sehr einfache Abfrage, die im Aktivitätsmonitor und in anderen Statistiken als die logischsten Lesevorgänge auf meinem gesamten DB-Server angezeigt wird.
SELECT MAX(RESULT_DATE) FROM TABLEX mm WITH (NOLOCK)
JOIN TABLEX_RESULTS mr WITH (NOLOCK) on mr.ID = mm.ID
WHERE DAYS IS NOT NULL AND mm.ORDER_ID = 12345
TABLEX hat ungefähr 28 Millionen Zeilen
TABLEX_RESULTS hat ungefähr 6 Millionen Zeilen
Was kann ich hier tun, um die Anzahl der logischen Lesevorgänge für diese Abfrage zu verringern? Ich bin etwas verwirrt darüber, wie eine so vereinfachte Abfrage so viele logische Lesevorgänge haben kann.
Vielen Dank
Indexdefinition (aus Kommentar)
tableX
IndexName PK Type Key1 Key2
IDX_MP_MEDS 0 B AA ORDER_ID MEDPASS_DATE
IDX_MP_MEDS_ID_AND_ORDER_ID 0 B A MEDPASS_DATE
IX_MP_MEDS_ROOT_ORDER_ID 0 B DA ROOT_ORDER_ID MEDPASS_DATE
PK_MP_MED PK 1 C A MEDPASS_MEDS_ID
tablex_resulsts
sql-server
sql-server-2008
Omikron Theta
quelle
quelle
DAYS
Spalte? Und derRESULT_DATE
eine?Antworten:
Das sind Seite liest, wohlgemerkt. Das ist relevant.
Möglichkeiten:
Ich vermute, Sie haben einen Tabellen- oder Clustered-Index-Scan, der für mindestens eines dieser Kriterien durchgeführt wird, und die Tabelle ist breit gefächert, wodurch viele Daten gelesen werden, unabhängig davon, wie viele Daten Sie tatsächlich benötigen.
quelle
Weil Sie keine geeigneten Indizes haben. Am wichtigsten ist, dass Sie einen Index für
TABLEX (ORDER_ID)
und einen Index für benötigenTABLEX_RESULTS (ID)
. Vorzugsweise sollte der Index einORDER_ID
enthalten(DAYS, ID, RESULT_DATE)
.Sie haben einen Index
ORDER_ID
, den Sie jedoch nicht abdecken . Für dietables_results
, entweder Sie haben keinen Index oder Ihr Kommentar ist sie nicht enthalten.quelle
Es gibt eine große Anzahl von Lesevorgängen, da SQL Server die Tabelle scannt, um Ihre Abfrage auszuführen. Dazu muss jede Zeile gelesen werden.
Sie können die Anzahl der Lesevorgänge reduzieren, indem Sie enge Indizes erstellen, die nur die von der Abfrage benötigten Spalten enthalten.
Sie können auch in Betracht ziehen, die Ergebnisse der Abfrage zwischenzuspeichern, um möglicherweise zu vermeiden, dass Sie sie öfter ausführen müssen, als Sie wirklich benötigen. Sie könnten im Speicher oder vielleicht in einer kleinen Tabelle zwischenspeichern.
Eine andere Möglichkeit besteht darin, Ihre Daten regelmäßig in einen Analysis Services-Cube zu verschieben und sie mit ADOMD.NET und MDX abzufragen. Dies sollte viel schneller sein als das Ausführen großer Abfragen vom Aggregationstyp in der relationalen Engine.
quelle