Freigeben über


Binden einer Datenbank mit Memory-Optimized Tabellen an einen Ressourcenpool

Ein Ressourcenpool stellt eine Teilmenge der physischen Ressourcen dar, die gesteuert werden können. Standardmäßig sind SQL Server-Datenbanken an die Ressourcen des Standardressourcenpools gebunden und verbrauchen. Um SQL Server davor zu schützen, dass seine Ressourcen von einer oder mehreren speicheroptimierten Tabellen verbraucht werden, und um zu verhindern, dass andere Speicherbenutzer Arbeitsspeicher verbrauchen, die von speicheroptimierten Tabellen benötigt werden, sollten Sie einen separaten Ressourcenpool erstellen, um die Speichernutzung für die Datenbank mit speicheroptimierten Tabellen zu verwalten.

Eine Datenbank kann nur an einen Ressourcenpool gebunden werden. Sie können jedoch mehrere Datenbanken an denselben Pool binden. SQL Server ermöglicht das Binden einer Datenbank ohne speicheroptimierte Tabellen an einen Ressourcenpool, hat aber keine Auswirkung. Sie können eine Datenbank an einen benannten Ressourcenpool binden, wenn Sie in Zukunft speicheroptimierte Tabellen in der Datenbank erstellen möchten.

Bevor Sie eine Datenbank an einen Ressourcenpool binden können, müssen sowohl die Datenbank als auch der Ressourcenpool vorhanden sein. Die Bindung wird wirksam, wenn die Datenbank das nächste Mal online gestellt wird. Weitere Informationen finden Sie unter Datenbankstatus .

Informationen zu Ressourcenpools finden Sie unter Resource Governor Resource Pool.

Erstellen der Datenbank und des Ressourcenpools

Sie können die Datenbank und den Ressourcenpool in beliebiger Reihenfolge erstellen. Wichtig ist, dass sie beide vorhanden sind, bevor sie die Datenbank an den Ressourcenpool binden.

Erstellen der Datenbank

Im folgenden Transact-SQL wird eine Datenbank namens IMOLTP_DB erstellt, die mindestens eine speicheroptimierte Tabelle enthält. Der Pfad driveAndPath <> muss vorhanden sein, bevor dieser Befehl ausgeführt wird.

CREATE DATABASE IMOLTP_DB  
GO  
ALTER DATABASE IMOLTP_DB ADD FILEGROUP IMOLTP_DB_fg CONTAINS MEMORY_OPTIMIZED_DATA  
ALTER DATABASE IMOLTP_DB ADD FILE( NAME = 'IMOLTP_DB_fg' , FILENAME = 'c:\data\IMOLTP_DB_fg') TO FILEGROUP IMOLTP_DB_fg;  
GO  

Ermitteln des Minimalwerts für MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT

Nachdem Sie die Speicheranforderungen für ihre speicheroptimierten Tabellen ermittelt haben, müssen Sie ermitteln, welcher Prozentsatz des verfügbaren Arbeitsspeichers Sie benötigen, und die Speicherprozentsätze auf diesen Wert oder höher festlegen.

Beispiel:
In diesem Beispiel wird davon ausgegangen, dass Sie aus Ihren Berechnungen festgestellt haben, dass Ihre speicheroptimierten Tabellen und Indizes 16 GB Arbeitsspeicher benötigen. Gehen Sie davon aus, dass Sie 32 GB Arbeitsspeicher für Ihre Verwendung zugesichert haben.

Auf den ersten Blick könnte es scheinen, dass Sie MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT auf 50 festlegen müssen (16 ist 50% von 32). Dies würde Ihren speicheroptimierten Tabellen jedoch keinen ausreichenden Arbeitsspeicher geben. In der nachstehenden Tabelle (Prozent des verfügbaren Arbeitsspeichers für speicheroptimierte Tabellen und Indizes) wird gezeigt, dass bei 32 GB zugesicherten Arbeitsspeicher nur 80% für speicheroptimierte Tabellen und Indizes verfügbar sind. Daher berechnen wir die Min- und Max-Prozentsätze basierend auf dem verfügbaren Speicher, nicht dem zugesicherten Speicher.

memoryNeedeed = 16
memoryCommitted = 32
availablePercent = 0.8
memoryAvailable = memoryCommitted * availablePercent
percentNeeded = memoryNeeded / memoryAvailable

Einsetzen von reellen Zahlen
percentNeeded = 16 / (32 * 0.8) = 16 / 25.6 = 0.625

Daher benötigen Sie mindestens 62,5% des verfügbaren Speichers, um die 16 GB-Anforderung Ihrer speicheroptimierten Tabellen und Indizes zu erfüllen. Da die Werte für MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT ganze Zahlen sein müssen, legen wir sie auf mindestens 63%fest.

Erstellen eines Ressourcenpools und Konfigurieren des Arbeitsspeichers

Bei der Konfiguration von Speicher für speicheroptimierte Tabellen sollte die Kapazitätsplanung basierend auf MIN_MEMORY_PERCENT und nicht auf MAX_MEMORY_PERCENT erfolgen. Informationen zu MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT finden Sie unter ALTER RESOURCE POOL (Transact-SQL ). Dies bietet eine vorhersehbarere Speicherverfügbarkeit für speicheroptimierte Tabellen, da MIN_MEMORY_PERCENT den Speicherdruck für andere Ressourcenpools verursacht, um sicherzustellen, dass sie berücksichtigt wird. Um sicherzustellen, dass Arbeitsspeicher verfügbar ist und Speichermangelbedingungen vermieden werden, sollten die Werte für MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT identisch sein. Siehe Prozent des verfügbaren Arbeitsspeichers für speicheroptimierte Tabellen und Indizes unten für den Prozentsatz des Arbeitsspeichers, der für speicheroptimierte Tabellen verfügbar ist, basierend auf der Menge des zugesicherten Arbeitsspeichers.

Weitere Informationen zum Arbeiten in einer VM-Umgebung finden Sie unter Bewährte Methoden: Verwenden von In-Memory OLTP in einer VM-Umgebung .

Der folgende Transact-SQL Code erstellt einen Ressourcenpool mit dem Namen Pool_IMOLTP mit der Hälfte des für seine Nutzung verfügbaren Arbeitsspeichers. Nachdem der Pool erstellt wurde, wird der Ressourcengouverneur neu konfiguriert, um Pool_IMOLTP einzuschließen.

-- set MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value  
CREATE RESOURCE POOL Pool_IMOLTP   
  WITH   
    ( MIN_MEMORY_PERCENT = 63,   
    MAX_MEMORY_PERCENT = 63 );  
GO  
  
ALTER RESOURCE GOVERNOR RECONFIGURE;  
GO  

Binden der Datenbank an den Pool

Verwenden Sie die Systemfunktion sp_xtp_bind_db_resource_pool , um die Datenbank an den Ressourcenpool zu binden. Die Funktion verwendet zwei Parameter: den Datenbanknamen und den Ressourcenpoolnamen.

Im folgenden Transact-SQL wird die Bindung der Datenbank IMOLTP_DB an den Ressourcenpool Pool_IMOLTP definiert. Die Bindung wird erst wirksam, wenn Sie die Datenbank online schalten.

EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'Pool_IMOLTP'  
GO  

Die Systemfunktion sp_xtp_bind_db_resourece_pool akzeptiert zwei Zeichenfolgenparameter: database_name und pool_name.

Bestätigen der Bindung

Bestätigen Sie die Bindung, und notieren Sie die Ressourcenpool-ID für IMOLTP_DB. Es sollte nicht NULL sein.

SELECT d.database_id, d.name, d.resource_pool_id  
FROM sys.databases d  
GO  

Die Bindung wirksam machen

Sie müssen die Datenbank offline und wieder online schalten, nachdem sie an den Ressourcenpool gebunden wurde, damit die Bindung wirksam wird. Wenn Ihre Datenbank früher an einen anderen Pool gebunden wurde, entfernt dies den zugewiesenen Speicher aus dem vorherigen Ressourcenpool und Speicherzuordnungen für ihre speicheroptimierte Tabelle, und Indizes stammen jetzt aus dem neu an die Datenbank gebundenen Ressourcenpool.

USE master  
GO  
  
ALTER DATABASE IMOLTP_DB SET OFFLINE  
GO  
ALTER DATABASE IMOLTP_DB SET ONLINE  
GO  
  
USE IMOLTP_DB  
GO  

Und jetzt ist die Datenbank an den Ressourcenpool gebunden.

Ändern von MIN MEMORY PERCENT und MAX MEMORY PERCENT in einem vorhandenen Speicherpool

Wenn Sie dem Server mehr Arbeitsspeicher hinzufügen oder der benötigte Arbeitsspeicher für Ihre speicheroptimierten Tabellen sich ändert, müssen Sie möglicherweise den Wert von MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT ändern. Die folgenden Schritte zeigen, wie Sie den Wert von MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT in einem Ressourcenpool ändern. Im folgenden Abschnitt finden Sie Anleitungen dazu, welche Werte für MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT verwendet werden sollen. Weitere Informationen finden Sie im Thema "Bewährte Methoden: Verwenden von In-Memory OLTP in einer VM-Umgebung ".

  1. Verwenden Sie ALTER RESOURCE POOL, um den Wert von MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT zu ändern.

  2. Verwenden Sie ALTER RESURCE GOVERNOR zum Neukonfigurieren des Ressourcengouverneurs mit den neuen Werten.

Beispielcode-

ALTER RESOURCE POOL Pool_IMOLTP  
WITH  
     ( MIN_MEMORY_PERCENT = 70,  
       MAX_MEMORY_PERCENT = 70 )   
GO  
  
-- reconfigure the Resource Governor  
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

Prozentsatz des verfügbaren Arbeitsspeichers für speicheroptimierte Tabellen und Indizes

Wenn Sie eine Datenbank mit speicheroptimierten Tabellen und einer SQL Server-Workload demselben Ressourcenpool zuordnen, legt die Ressourcenverwaltung einen internen Schwellenwert für In-Memory OLTP-Verwendung fest, sodass die Benutzer des Pools keine Konflikte über die Poolnutzung haben. Im Allgemeinen beträgt der Schwellenwert für In-Memory OLTP-Verwendung etwa 80% des Pools. Die folgende Tabelle zeigt tatsächliche Schwellenwerte für verschiedene Speichergrößen.

Wenn Sie einen dedizierten Ressourcenpool für die In-Memory OLTP-Datenbank erstellen, müssen Sie abschätzen, wie viel physischer Arbeitsspeicher Sie für die In-Memory-Tabellen benötigen, nachdem Zeilenversionen und Datenwachstum erfasst wurden. Nachdem Sie den erforderlichen Arbeitsspeicher geschätzt haben, erstellen Sie einen Ressourcenpool mit einem Prozent des Commit-Zielspeichers für die SQL-Instanz, wie in der Spalte "committed_target_kb" im DMV sys.dm_os_sys_info angegeben (siehe sys.dm_os_sys_info). Sie können beispielsweise einen Ressourcenpool P1 mit 40% des gesamt verfügbaren Arbeitsspeichers für die Instanz erstellen. Aus diesen 40%erhält die In-Memory OLTP-Engine einen geringeren Prozentsatz, um In-Memory OLTP-Daten zu speichern. Dadurch wird sichergestellt, dass In-Memory OLTP nicht den gesamten Speicher aus diesem Pool verbraucht. Der Wert des kleineren Prozentsatzes hängt vom festgelegten zugesicherten Zielspeicher ab. In der folgenden Tabelle wird der Speicherplatz beschrieben, der für die In-Memory OLTP-Datenbank in einem Ressourcenpool (benannt oder Standard) verfügbar ist, bevor ein OOM-Fehler auftritt.

Zielbereitstellungsspeicher Prozentanteil verfügbar für In-Memory-Tabellen
<= 8 GB 70 %
<= 16 GB 75 %
<= 32 GB 80%
<= 96 GB 85%
>96 GB 90 %

Wenn Ihr "zugewiesener Ziel-Speicher" beispielsweise 100 GB beträgt und Sie schätzen, dass Ihre speicheroptimierten Tabellen und Indizes 60 GB Speicher benötigen, dann können Sie einen Ressourcenpool mit MAX_MEMORY_PERCENT = 67 erstellen (60 GB erforderlich / 0,90 = 66,667 GB - auf 67 GB aufrunden; 67 GB / 100 GB installiert = 67%), um sicherzustellen, dass Ihre In-Memory OLTP-Objekte die benötigten 60 GB erhalten.

Nachdem eine Datenbank an einen benannten Ressourcenpool gebunden wurde, verwenden Sie die folgende Abfrage, um Speicherzuordnungen für verschiedene Ressourcenpools anzuzeigen.

SELECT pool_id  
     , Name  
     , min_memory_percent  
     , max_memory_percent  
     , max_memory_kb/1024 AS max_memory_mb  
     , used_memory_kb/1024 AS used_memory_mb   
     , target_memory_kb/1024 AS target_memory_mb  
   FROM sys.dm_resource_governor_resource_pools  

Diese Beispielausgabe zeigt, dass der von speicheroptimierten Objekten belegte Speicher im Ressourcenpool 'PoolIMOLTP' 1356 MB beträgt, mit einer Obergrenze von 2307 MB. Diese obere Grenze steuert den gesamten Arbeitsspeicher, der von Benutzern und vom Systemspeicher optimierten Objekten verwendet werden kann, die diesem Pool zugeordnet sind.

Beispielausgabe
Diese Ausgabe stammt aus der Datenbank und tabellen, die wir oben erstellt haben.

pool_id     Name        min_memory_percent max_memory_percent max_memory_mb used_memory_mb target_memory_mb  
----------- ----------- ------------------ ------------------ ------------- -------------- ----------------   
1           internal    0                  100                3845          125            3845  
2           default     0                  100                3845          32             3845  
259         PoolIMOLTP 0                  100                3845          1356           2307  

Weitere Informationen finden Sie unter sys.dm_resource_governor_resource_pools (Transact-SQL).

Wenn Sie Ihre Datenbank nicht an einen benannten Ressourcenpool binden, ist sie an den Standardpool gebunden. Da der Standardressourcenpool von SQL Server für die meisten anderen Zuordnungen verwendet wird, können Sie den von speicheroptimierten Tabellen verbrauchten Arbeitsspeicher nicht mithilfe der DMV-sys.dm_resource_governor_resource_pools genau für die gewünschte Datenbank überwachen.

Siehe auch

sys.sp_xtp_bind_db_resource_pool (Transact-SQL)
sys.sp_xtp_unbind_db_resource_pool (Transact-SQL)
Ressourcenkontrolle
Ressourcenpool für die Ressourcenkontrolle
Erstellen eines Ressourcenpools
Ändern der Einstellungen für den Ressourcenpool
Löschen eines Ressourcenpools