Warum so viele logische Lesevorgänge?

7

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
Omikron Theta
quelle
4
Was sind die Angaben auf den Tabellen und was zeigt der Profiler, wie die Tabellen und Indizes gescannt werden
user151019
In welcher Tabelle befindet sich die DAYSSpalte? Und der RESULT_DATEeine?
Ypercubeᵀᴹ

Antworten:

10

Das sind Seite liest, wohlgemerkt. Das ist relevant.

Möglichkeiten:

  • Unsachgemäße oder unzureichende Indizierung. Sind einige der gefilterten Felder indiziert? Wie breit sind die Indizes (siehe unten)?
  • Schlechte Seitendichte. Was ist Ihr Füllfaktor für Indizes, die Sie möglicherweise haben? Wenn es zu niedrig ist, ziehen Sie dafür viele Seiten.
  • Sehr breite Indizes. Wenn Sie Indizes haben, aber viele Felder oder sehr breite Felder, erhalten Sie weniger Zeilen pro Seite.

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.

JNK
quelle
Was können Sie gegen breite Indizes tun? Einfach mit Hochdruck entfernen? Normalerweise füge ich keine Indizes hinzu, die nicht vom SQL Server angefordert werden.
Omikron Theta
Trotzdem kann ich meine Indexabfrage nicht richtig formatieren, um hier zu posten. Ich glaube nicht, dass mir Indizes fehlen. Wäre SQL Server nicht ein Vorschlagsindex, wenn ich es wäre? Auch die Abfrage selbst läuft extrem schnell, weniger als 1 Sekunde. Was fehlt mir also?
Omikron Theta
6

Weil Sie keine geeigneten Indizes haben. Am wichtigsten ist, dass Sie einen Index für TABLEX (ORDER_ID)und einen Index für benötigen TABLEX_RESULTS (ID). Vorzugsweise sollte der Index ein ORDER_IDenthalten (DAYS, ID, RESULT_DATE).

Sie haben einen Index ORDER_ID, den Sie jedoch nicht abdecken . Für die tables_results, entweder Sie haben keinen Index oder Ihr Kommentar ist sie nicht enthalten.

Remus Rusanu
quelle
3

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.

RickNZ
quelle