it-swarm.com.de

Wie viel RAM sollte SQL Server haben?

Ich habe eine Datenbank, die 500 GB belegt. Ich habe festgestellt, dass mein Ple niedrig ist, obwohl ich 100 GB RAM habe. Ich habe in Google nach Gründen dafür gesucht und einige interessante Fragen gefunden. Ich habe eine Abfrage, die auf einer sehr großen Tabelle ausgeführt wird, obwohl sie einen Clustered-Index verwendet, der dazu führt, dass ple gelöscht wird. Ich habe vor und nach der Abfrage und kurz nach der Abfrage überprüft, was sich im Pufferpool befindet, und es sieht so aus, als müsste die Datenbank Speicherplatz für den in meiner Abfrage verwendeten Index freigeben, und nachdem alte Abfragen in den Pufferpool geladen wurden. Meine Frage ist, wie viel RAM Speicher sollte DB haben, wie könnte ich es berechnen, sollte es eine Menge sein, mit der ich alle verwendeten Indizes auf einmal im Speicher behalten kann? Oder vielleicht sollte ich die gespeicherten Daten reduzieren in Tabellen, damit die Indizes kleiner werden?

5
whd

Jedes Mal, wenn Sie einen großen Index (oder eine große Tabelle, wenn Sie dies bevorzugen) scannen, müssen diese Daten von der Festplatte in den Speicher übertragen werden. In diesem Fall muss etwas verworfen werden, wenn der Pufferpool Daten von anderen Objekten enthält und nicht genügend freier Speicherplatz für die von der Festplatte gelesenen Seiten vorhanden ist.

Niedriger PLE bedeutet, dass dieser Prozess zu oft abläuft, Ihren Pufferpool überlastet und Ihr E/A-Subsystem überfordert.

Einige Möglichkeiten zur Verbesserung:

  1. Fügen Sie mehr RAM hinzu. Einfach und heutzutage nicht sehr teuer. Löst das Problem nicht wirklich, kann aber eine akzeptable kurzfristige Lösung sein. Wie viel RAM? Genug, um den aktiven Teil Ihrer Datenbanken zu speichern. Nur Sie können sagen, wie viel das ist. Nicht alle Versionen/Editionen von SQL Server und Windows können dieselbe RAM-Größe verwenden. Stellen Sie daher sicher, dass Sie nicht darauf beschränkt sind.
  2. Einige Daten löschen. Sind Sie sicher, dass Sie alle Daten benötigen, die Sie dort haben?
  3. Erstellen Sie kleinere Indizes. Das bedeutet, dass Sie in Ihre Indizes die Mindestmenge an Spalten aufnehmen, die Ihre Abfragen abdecken. Große Scans funktionieren bei kleineren Indizes schneller und erfordern weniger RAM. Der Kompromiss ist mehr Speicherplatz auf der Festplatte und mehr Vorgänge beim Aktualisieren der Tabelle.
  4. Erstellen Sie gefilterte Indizes. Wenn Sie häufig nach einer häufigen nicht selektiven Bedingung filtern (z. B.: active=true oder ähnliches) Ein gefilterter Index kann dazu beitragen, die Größe der Indizes zu verringern. Dies hat auch einige Auswirkungen auf die Anwendung (einige Einschränkungen der SET-Optionen, damit sie funktioniert).
  5. Verwenden Sie die Komprimierung. Daten werden sowohl auf der Festplatte als auch im Speicher komprimiert, sodass die Komprimierung ROW/PAGE eine Möglichkeit sein kann, den Speicherverbrauch zu reduzieren. Sie benötigen die Enterprise Edition und müssen auf einige CPU verzichten, aber für große Objekte lohnt es sich oft.
  6. Verwenden Sie die richtigen Datentypen: using (n)char Über (n)varchar oder int, wenn tinyint ausreicht, wird nicht nur Speicherplatz, sondern auch Pufferpoolspeicher verschwendet. Dies umfasst Zeichen- und numerische Datentypen: Stellen Sie sicher, dass Sie den richtigen Typ/Größe/Genauigkeit/Maßstab für Ihre Datenspalten verwenden.
7
spaghettidba

obwohl ich 100 GB RAM-Speicher habe.

Welche Version und Edition von SQL Server verwenden Sie? Die Standard Edition 2012 (und früher) verwendet nur bis zu 64 GB. Wenn Sie diese verwenden, ist es in dieser Situation wenig sinnvoll, mehr Speicher hinzuzufügen. Auch in späteren Versionen liegt das Limit für die Standard Edition bei 128 GB. Wenn Sie ein Unternehmen betreiben, sind solche Beschränkungen natürlich nicht vorhanden.

Ich habe eine Abfrage, die auf einer sehr großen Tabelle ausgeführt wird, obwohl sie einen Clustered-Index verwendet, der dazu führt, dass ple gelöscht wird.

"obwohl es einen Clustered-Index verwendet" - wenn es Scannen der Clustered-Index ist, liest es im Wesentlichen die gesamte Tabelle. Wenn die Abfrage nicht jede Spalte jeder Zeile berücksichtigen muss, um das Ergebnis zu erzielen, gibt es eine Möglichkeit zur Umgestaltung der Abfrage und/oder Aktualisierung der Indizierung der beteiligten Tabellen. Ohne Details können wir nicht weiter helfen (idealerweise: Tabellendefinitionen einschließlich Indizes und Schlüssel, Abfrage, geschätzte und tatsächliche Abfragepläne). Wir können dort nicht mehr helfen.

Meine Frage ist, wie viel RAM Speicher sollte DB haben, wie könnte ich es berechnen

Dies ist leider eine schwierige Frage. Zu diesem Thema wurden viele große Artikel geschrieben.

sollte es ein Betrag sein, mit dem ich alle verwendeten Indizes gleichzeitig im Speicher behalten kann?

Die Faustregel lautet "genug, damit sich der gemeinsame Arbeitssatz immer im Speicher befindet" (in vielen Fällen bedeutet "alle verwendeten Indizes im Speicher" mehr oder weniger dasselbe), was normalerweise ein kleines Vielfaches des gemeinsamen Arbeitssatzes ist - aber Sie können sich das auch umgekehrt vorstellen: Wie kann ich bei gleicher Datenmenge meine Indizes und Abfragen besser gestalten, um den erforderlichen gemeinsamen Arbeitssatz zu reduzieren? Wenn Sie niemals einen vollständigen Index oder Heap scannen, müssen Sie nicht sicherstellen, dass das gesamte Los im RAM verbleibt.

Oder sollte ich die in Tabellen gespeicherten Daten reduzieren, damit die Indizes kleiner werden?

Wenn Sie die Daten benötigen, benötigen Sie die Daten. Sie können alte Daten in einer anderen Datenbank archivieren, obwohl dies normalerweise durchgeführt wird, um Speicherplatz und Verarbeitungszeit für vollständige Sicherungen usw. zu sparen, anstatt für Laufzeitprobleme: Eine gut gestaltete/indizierte Datenbank mit gut verhaltenen Apps sollte dies im Allgemeinen nicht benötigen.

3
David Spillett

Abgesehen von vorhandenen Antworten müssen Sie wissen, wie RAM von SQL Server verwendet wird.

Angenommen, Sie haben eine Box mit 100 GB RAM nur für SQL Server reserviert. SQL Server verwendet all dies RAM, bis Sie es einschränken und beispielsweise SQL einschränken Maximaler Speicher des Servers auf 94 GB ...

Lassen Sie uns verstehen, wie dieser 94-GB-Speicher verwendet wird und welche Hauptkomponenten diesen Speicher verwenden.

-- Wenn ich unter DMV laufe, bekomme ich eine Gesamtliste der Komponenten, die diesen 94 GB RAM verwenden können

select (sum(pages_kb))/1024 as 'sizein_mb',type as 'clerkttype'
from sys.dm_os_memory_clerks
group by type
order by (sum(pages_kb)*128)/1024 desc

sizein_mb   clerkttype
92469779    MEMORYCLERK_SQLBUFFERPOOL
2889702 CACHESTORE_OBJCP
786610  CACHESTORE_SQLCP
274682  OBJECTSTORE_LOCK_MANAGER
221056  MEMORYCLERK_SOSNODE
206657  USERSTORE_SCHEMAMGR
186691  USERSTORE_TOKENPERM
125331  USERSTORE_DBMETADATA
84542   MEMORYCLERK_SQLSTORENG

Wie Sie aus der obigen Ausgabe ersehen können, gibt es viele Komponenten, die derzeit Speicher verwenden, und wir können sehen, dass Pufferpool der größte Speicherverbraucher ist, gefolgt von Plan-Cache =, Lock Manager ..

Ein wichtiger Punkt, den Sie beachten sollten, ist, dass die oben genannten Komponenten den Speicher untereinander anpassen würden. So wird beispielsweise der vom Plan-Cache verwendete Speicher aus dem Pufferpool gestohlen. Wenn Ihr Plan-Cache also mit Ad-hoc-Plänen gefüllt ist, verfügt der Pufferpool über weniger Speicher arbeiten und es wiederum zwingt Seiten auf die Festplatte, was nicht gut ist ..

Jetzt haben Sie verstanden, wie das RAM, das Sie als Limit festgelegt haben, verwendet wird. Es ist gut zu wissen, welche Objekte verwendet werden können, wie die 6 GB RAM, die Sie verlassen haben) zu OS wird verwendet ..

Nachfolgend sind die Komponenten aufgeführt, die ihren Speicher in 6 GB ableiten

1.Os itself
2.Linked servers
3.Extended stored procs
3.third party dlls or addins
4.Database email
4.SSIS
5.SSRS
6.SSAS and so on

Nachdem Sie verstanden haben, wie SQL den RAM nutzt, können Sie leicht eine Entscheidung treffen und mit der Fehlerbehebung beginnen, wenn ebenfalls ein Problem auftritt

3
TheGameiswar