Verbrauchen Indizes Speicher?

10

Ich fange gerade an, etwas über die Speichernutzung in SQL Server zu lernen. Bei Verwendung der Abfrage in der Antwort auf die Frage SQL Server 2008 R2 "Ghost Memory"? Ich habe festgestellt, dass eine einzelne Datenbank den Löwenanteil des Speicherplatzes im Pufferpool einnimmt. Mit Blick auf sys.allocation_unitsund sys.indexesbestätigte ich, dass dies wahrscheinlich auf die starke Verwendung von Indizes in der Datenbank zurückzuführen ist. Die meisten Indizes sind gruppiert.

Ein anderer Datenbankentwickler glaubt, dass auf dem Server Speicherprobleme auftreten. Abfragen werden langsam ausgeführt, da kein Speicher verfügbar ist.

Meine Frage hier ist: Nimmt die Verwendung dieser Indizes und ihre Existenz im Pufferpool den für andere Prozesse verfügbaren Speicher weg?

JHFB
quelle
2
"Another database developer believes we are having memory issues on the server"-- basierend worauf? Wie viel RAM hat der Server, wie lauten die Instanzspeichereinstellungen und wie viel Speicher wird vom Prozedurcache belegt?
Jon Seigel
Basierend auf längeren Abfragezeiten und dem Blick auf den Task-Manager - der meiner Forschung zufolge ein "schmutziger, schmutziger Lügner" ist (danke Brent Ozar - brentozar.com/archive/2011/09/… ). Ich kann feststellen, dass es kein Speicherproblem gibt - ich folge allen Vorschlägen in diesen Kommentaren und Antworten!
JHFB
2
Da wir hier den 8-Ball rollen, laufen die Abfragen meiner Meinung nach langsam, weil sie von diesem 'anderen' Datenbankentwickler geschrieben wurden ...
Remus Rusanu

Antworten:

12

Ja, die Datenseiten eines verwendeten Index, die im Pufferpool zwischengespeichert werden, belegen Speicherplatz im Datencache . Lassen Sie sich dadurch jedoch nicht von der Verwendung von Indizes abbringen (zunächst einmal ist ein Clustered-Index die eigentliche Tabellendaten, denken Sie also auch daran). Die Verwendung von Indizes (natürlich richtig entworfen und implementiert) ist eine gute Sache.

Ihre Speicherprobleme sind höchstwahrscheinlich nicht darauf zurückzuführen, dass Ihre Tabellen Indizes enthalten . Tauchen Sie ein in die Speicherprobleme, was genau sind die Probleme? Haben Sie eine niedrige Lebenserwartung für Seiten ? Wie ist Ihr Speicher auf dem Server konfiguriert? Ist der maximale Serverspeicher zu niedrig, um die Größe des Pufferpools einzuschränken?

Um eine Aufschlüsselung der Indexseiten in Ihrem Datencache zu erhalten, können Sie die folgende Abfrage ausführen:

select
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by page_type

So erhalten Sie diese Statistiken per Datenbank:

select
    db_name(database_id) as database_name,
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by database_id
order by total_consumption_kb desc
Thomas Stringer
quelle
Anständige (?) Lebenserwartung der Seite - 4234. Ich muss die Trefferquote des Puffer-Cache untersuchen und die anderen Teile untersuchen.
JHFB
Dieser PLE zeigt überhaupt keinen Speicherdruck. Alles über 1000 als Faustregel (natürlich gibt es immer "es kommt darauf an") ist akzeptabel.
Thomas Stringer
Die Trefferquote im Puffer-Cache kann sehr irreführend oder unbrauchbar sein. Siehe Große SQL Server-Debatten: Puffer-Cache- Trefferquote von @JonathanKehayias.
Mark Storey-Smith
@ MarkStorey-Smith Noted, danke für den Zeiger!
Thomas Stringer
@JHFB Machen wir einen Schritt zurück. Was lässt Sie denken, dass Sie Gedächtnisdruck haben?
Thomas Stringer
7

Indizes belegen Pufferpoolspeicher, ja. Dies ist ein weiterer Grund, warum Sie mit Ihrer Indizierungsstrategie vorsichtig sein und Duplikate minimieren sollten.

Ich habe bestätigt, dass dies wahrscheinlich auf die starke Verwendung von Indizes in der Datenbank zurückzuführen ist. Die meisten Indizes sind gruppiert.

Denken Sie daran, dass ein Clustered-Index die Tabelle ist . Der einzige Aufwand für einen Clustered-Index, der über den für einen Heap hinausgeht (was im Allgemeinen unerwünscht ist), betrifft die Nicht-Blatt-Indexseiten und die Aufnahme des Cluster-Schlüssels in alle Nicht-Clustered-Indizes für diese Tabelle. Aus diesem Grund werden schmale Clusterschlüssel bevorzugt.

Die Artikel von Kimberley Tripp über die Auswahl von Schlüsselclustern sind hierfür eine hervorragende Referenz.

Mark Storey-Smith
quelle
+1 Dass Frau Tripps Artikel EPIC über das Clustering von Schlüsseln sind ...
Fabricio Araujo