Associazione di un database con tabelle con ottimizzazione per la memoria a un pool di risorseBind a Database with Memory-Optimized Tables to a Resource Pool

In questo argomento si applica a: SìSQL ServernonDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Un pool di risorse rappresenta un subset di risorse fisiche che è possibile governare.A resource pool represents a subset of physical resources that can be governed. Per impostazione predefinita, i database di SQL ServerSQL Server vengono associati alle risorse del pool di risorse predefinito e usano queste ultime.By default, SQL ServerSQL Server databases are bound to and consume the resources of the default resource pool. Per evitare che in SQL ServerSQL Server tutte le risorse vengano usate da una o più tabelle ottimizzate per la memoria e che altri utenti utilizzino la memoria necessaria per le tabelle ottimizzate per la memoria, è consigliabile creare un pool di risorse distinto per gestire l'utilizzo di memoria per il database con tabelle ottimizzate per la memoria.To protect SQL ServerSQL Server from having its resources consumed by one or more memory-optimized tables, and to prevent other memory users from consuming memory needed by memory-optimized tables, you should create a separate resource pool to manage memory consumption for the database with memory-optimized tables.

Un database può essere associato a un solo pool di risorse.A database can be bound on only one resource pool. Tuttavia, è possibile associare più database allo stesso pool.However, you can bind multiple databases to the same pool. SQL ServerSQL Server consente di associare un database senza tabelle ottimizzate per la memoria a un pool di risorse, ma questa operazione non ha alcun effetto. allows binding a database without memory-optimized tables to a resource pool but it has no effect. Può essere opportuno associare un database a un pool di risorse denominato se, in futuro, si intende creare tabelle ottimizzate per la memoria nel database.You may want to bind a database to a named resource pool if, in future, you may want to create memory-optimized tables in the database.

Prima di poter associare un database a un pool di risorse, è necessario che sia presente sia il database che il pool di risorse.Before you can bind a database to a resource pool both the database and the resource pool must exist. L'associazione viene applicata alla successiva connessione del database.The binding takes effect the next time the database is brought online. Per altre informazioni, vedere Stati del database .See Database States for more information.

Per informazioni sui pool di risorse, vedere Pool di risorse di Resource Governor.For information about resource pools, see Resource Governor Resource Pool.

Passaggi per associare un database a un pool di risorseSteps to bind a database to a resource pool

  1. Creare il database e il pool di risorseCreate the database and resource pool

    1. Creare il databaseCreate the database

    2. Determinare il valore minimo per MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT.Determine the minimum value for MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT

    3. Creare un pool di risorse e configurare la memoriaCreate a resource pool and configure memory

  2. Associare il database al pool.Bind the database to the pool

  3. Verificare l'associazioneConfirm the binding

  4. Rendere effettiva l'associazioneMake the binding effective

    Altro contenuto di questo argomentoOther content in this topic

Creare il database e il pool di risorseCreate the database and resource pool

È possibile creare il database e il pool di risorse in qualsiasi ordine.You can create the database and resource pool in any order. La cosa importante è che entrambi esistano prima di associare il database al pool di risorse.What matters is that they both exist prior to binding the database to the resource pool.

Creare il databaseCreate the database

Con l'istruzione Transact-SQLTransact-SQL seguente viene creato un database denominato IMOLTP_DB in cui saranno incluse una o più tabelle ottimizzate per la memoria.The following Transact-SQLTransact-SQL creates a database named IMOLTP_DB which will contain one or more memory-optimized tables. Il percorso <UnitàPercorso> deve esistere prima dell'esecuzione del comando.The path <driveAndPath> must exist prior to running this command.

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  

Determinare il valore minimo per MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT.Determine the minimum value for MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT

Dopo aver determinato la memoria necessaria per le tabelle ottimizzate per la memoria, è necessario determinare la percentuale di memoria disponibile necessaria e impostare le percentuali di memoria su un valore uguale o superiore.Once you determine the memory needs for your memory-optimized tables, you need to determine what percentage of available memory you need, and set the memory percentages to that value or higher.

Esempio: Example:
In questo esempio si suppone che sia stato calcolato che gli indici e le tabelle ottimizzate per la memoria richiedano 16 GB di memoria.For this example we will assume that from your calculations you determined that your memory-optimized tables and indexes need 16 GB of memory. Si suppone inoltre che siano stati riservati 32 GB di memoria per l'utilizzo da parte dell'utente.Assume that you have 32 GB of memory committed for your use.

A prima vista, si potrebbe ritenere corretto impostare MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT su 50 (16 è il 50% di 32).At first glance it could seem that you need to set MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to 50 (16 is 50% of 32). Tuttavia, questo valore non garantirebbe memoria sufficiente alle tabelle ottimizzate per la memoria.However, that would not give your memory-optimized tables sufficient memory. Nella tabella seguente (la sezione relativa alla percentuale di memoria disponibile per indici e tabelle ottimizzate per la memoria) è possibile notare che se si riservano 32 GB di memoria, solo l'80% di tale valore sarà disponibile per gli indici e le tabelle ottimizzate per la memoria.Looking at the table below (Percent of memory available for memory-optimized tables and indexes) we see that if there is 32 GB of committed memory, only 80% of that is available for memory-optimized tables and indexes. Pertanto, le percentuali minima e massima sono calcolate in base alla memoria disponibile, non alla memoria riservata.Therefore, we calculate the min and max percentages based upon the available memory, not the committed memory.

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

Inserimento di numeri reali:Plugging in real numbers:
percentNeeded = 16 / (32 * 0.8) = 16 / 25.6 = 0.625

È pertanto necessario almeno il 62,5% della memoria disponibile per soddisfare il requisito di 16 GB degli indici e delle tabelle ottimizzate per la memoria.Thus you need at least 62.5% of the available memory to meet the 16 GB requirement of your memory-optimized tables and indexes. Poiché i valori di MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT devono essere numeri interi, viene impostato un valore pari almeno al 63%.Since the values for MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT must be integers, we set them to at least 63%.

Creare un pool di risorse e configurare la memoriaCreate a resource pool and configure memory

Quando si configura la memoria per le tabelle ottimizzate per la memoria, la pianificazione della capacità deve essere eseguita in base a MIN_MEMORY_PERCENT, non MAX_MEMORY_PERCENT.When configuring memory for memory-optimized tables, the capacity planning should be done based on MIN_MEMORY_PERCENT, not on MAX_MEMORY_PERCENT. Per informazioni su MIN_MEMORY_PERCENT e su MAX_MEMORY_PERCENT, vedere ALTER RESOURCE POOL (Transact-SQL).See ALTER RESOURCE POOL (Transact-SQL) for information on MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT. Ciò rende maggiormente stimabile la disponibilità di memoria per le tabelle ottimizzate per la memoria, poiché MIN_MEMORY_PERCENT causa un utilizzo elevato di memoria per gli altri pool di risorse, al fine di garantire la disponibilità.This provides more predictable memory availability for memory-optimized tables as MIN_MEMORY_PERCENT causes memory pressure to other resource pools to make sure it is honored. Per garantire che la memoria sia disponibile ed evitare condizioni di memoria insufficiente, i valori di MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT devono essere uguali.To ensure that memory is available and help avoid out-of-memory conditions, the values for MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT should be the same. Vedere la sezione relativa alla percentuale di memoria disponibile per indici e tabelle ottimizzate per la memoria per i valori in base alla quantità di memoria riservata.See Percent of memory available for memory-optimized tables and indexes below for the percent of memory available for memory-optimized tables based on the amount of committed memory.

Per altre informazioni sull'uso di un ambiente di VM, vedere Procedure consigliate: Uso di OLTP in memoria in un ambiente di VM .See Best Practices: Using In-Memory OLTP in a VM environment for more information when working in a VM environment.

Con il codice Transact-SQLTransact-SQL seguente viene creato un pool di risorse denominato Pool_IMOLTP con metà della memoria disponibile per l'utilizzo.The following Transact-SQLTransact-SQL code creates a resource pool named Pool_IMOLTP with half of the memory available for its use. Dopo la creazione del pool, Resource Governor viene riconfigurato in modo da includere Pool_IMOLTP.After the pool is created Resource Governor is reconfigured to include Pool_IMOLTP.

-- 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  

Associare il database al pool.Bind the database to the pool

Usare la funzione di sistema sp_xtp_bind_db_resource_pool per associare il database al pool di risorse.Use the system function sp_xtp_bind_db_resource_pool to bind the database to the resource pool. La funzione accetta due parametri: il nome del database e il nome del pool di risorse.The function takes two parameters: the database name and the resource pool name.

Con l'istruzione Transact-SQLTransact-SQL seguente viene definita un'associazione del database IMOLTP_DB al pool di risorse Pool_IMOLTP.The following Transact-SQLTransact-SQL defines a binding of the database IMOLTP_DB to the resource pool Pool_IMOLTP. L'associazione non diventa effettiva finché il database non viene portato online.The binding does not become effective until you bring the database online.

EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'Pool_IMOLTP'  
GO  

La funzione di sistema sp_xtp_bind_db_resourece_pool accetta due parametri di stringa: database_name e pool_name.The system function sp_xtp_bind_db_resourece_pool takes two string parameters: database_name and pool_name.

Verificare l'associazioneConfirm the binding

Verificare l'associazione, annotando l'ID del pool di risorse per IMOLTP_DB.Confirm the binding, noting the resource pool id for IMOLTP_DB. Non deve essere NULL.It should not be NULL.

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

Rendere effettiva l'associazioneMake the binding effective

Dopo aver associato il database al pool di risorse, è necessario portare il database offline, quindi di nuovo online per rendere effettiva l'associazione.You must take the database offline and back online after binding it to the resource pool for binding to take effect. Se in precedenza il database era stato associato a un pool diverso, tramite questa operazione la memoria allocata verrà rimossa dal pool di risorse precedente e verranno usate le allocazioni di memoria per gli indici e la tabella ottimizzata per la memoria provenienti dal pool di risorse appena associato al database.If your database was bound to an a different pool earlier, this removes the allocated memory from the previous resource pool and memory allocations for your memory-optimized table and indexes will now come from the resource pool newly bound with the database.

USE master  
GO  

ALTER DATABASE IMOLTP_DB SET OFFLINE  
GO  
ALTER DATABASE IMOLTP_DB SET ONLINE  
GO  

USE IMOLTP_DB  
GO  

Il database è ora associato al pool di risorse.And now, the database is bound to the resource pool.

Modificare il valore di MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT in un pool esistenteChange MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on an existing pool

Se si aggiunge altra memoria al server o se cambia la quantità di memoria necessaria per le tabelle ottimizzate per la memoria, può essere necessario modificare il valore di MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT.If you add additional memory to the server or the amount of memory needed for your memory-optimized tables changes, you may need to alter the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT. Nei passaggi seguenti viene illustrato come modificare il valore di MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT in un pool di risorse.The following steps show you how to alter the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on a resource pool. Per informazioni sui valori da usare per MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT, vedere la sezione seguente.See the section below, for guidance on what values to use for MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT. Per altre informazioni, vedere l'argomento Procedure consigliate: Uso di OLTP in memoria in un ambiente di VM .See the topic Best Practices: Using In-Memory OLTP in a VM environment for more information.

  1. Usare ALTER RESOURCE POOL per modificare il valore di MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT.Use ALTER RESOURCE POOL to change the value of both MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT.

  2. Usare ALTER RESURCE GOVERNOR per riconfigurare Resource Governor con i nuovi valori.Use ALTER RESURCE GOVERNOR to reconfigure the Resource Governor with the new values.

    Codice di esempioSample Code

ALTER RESOURCE POOL Pool_IMOLTP  
WITH  
     ( MIN_MEMORY_PERCENT = 70,  
       MAX_MEMORY_PERCENT = 70 )   
GO  

-- reconfigure the Resource Governor  
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

        </a> Percentuale di memoria disponibile per indici e tabelle ottimizzate per la memoria</span><span class="sxs-lookup"><span data-stu-id="f3be4-173"><a name="bkmk_PercentAvailable"></a> Percent of memory available for memory-optimized tables and indexes</span></span>  

Se si esegue il mapping di un database con tabella ottimizzata per la memoria e un carico di lavoro di SQL ServerSQL Server allo stesso pool di risorse, tramite Resource Governor viene impostata una soglia interna per l'utilizzo di OLTP in memoriaIn-Memory OLTP in modo tale che gli utenti del pool non abbiano conflitti per l'utilizzo del pool.If you map a database with memory-optimized tables and a SQL ServerSQL Server workload to the same resource pool, the Resource Governor sets an internal threshold for OLTP in memoriaIn-Memory OLTP use so that the users of the pool do not have conflicts over pool usage. In generale, la soglia per l'utilizzo di OLTP in memoriaIn-Memory OLTP è di circa l'80% del pool.Generally speaking, the threshold for OLTP in memoriaIn-Memory OLTP use is about 80% of the pool. Nella tabella seguente vengono illustrate le soglie effettive per varie dimensioni di memoria.The following table shows actual thresholds for various memory sizes.

Quando si crea un pool di risorse dedicato per il database OLTP in memoriaIn-Memory OLTP , è necessario stimare la quantità di memoria fisica necessaria per le tabelle in memoria dopo aver tenuto conto delle versioni di riga e della crescita dei dati.When you create a dedicated resource pool for the OLTP in memoriaIn-Memory OLTP database, you need to estimate how much physical memory you need for the in-memory tables after accounting for row versions and data growth. Dopo avere stimato la memoria necessaria, è possibile creare un pool di risorse con una percentuale della memoria di destinazione di commit per l'istanza di SQL come indicato nella colonna 'committed_target_kb' nella DMV sys.dm_os_sys_info (vedere sys.dm_os_sys_information).Once estimate the memory needed, you create a resource pool with a percent of the commit target memory for SQL Instance as reflected by column ‘committed_target_kb’ in the DMV sys.dm_os_sys_info (see sys.dm_os_sys_info). Ad esempio, è possibile creare un pool di risorse P1 con il 40% della memoria totale disponibile per l'istanza.For example, you can create a resource pool P1 with 40% of the total memory available to the instance. Da questo 40%, il motore di OLTP in memoriaIn-Memory OLTP ottiene una percentuale inferiore per archiviare i dati di OLTP in memoriaIn-Memory OLTP .Out of this 40%, the OLTP in memoriaIn-Memory OLTP engine gets a smaller percent to store OLTP in memoriaIn-Memory OLTP data. Ciò garantisce che OLTP in memoriaIn-Memory OLTP non utilizzi tutta la memoria del pool.This is done to make sure OLTP in memoriaIn-Memory OLTP does not consume all the memory from this pool. Il valore della percentuale inferiore dipende dalla memoria riservata alla destinazione.This value of the smaller percent depends upon the Target committed Memory. Nella tabella seguente viene descritta la memoria disponibile per il database OLTP in memoriaIn-Memory OLTP in un pool di risorse (denominato o predefinito) prima che venga generato un errore di memoria insufficiente.The following table describes memory available to OLTP in memoriaIn-Memory OLTP database in a resource pool (named or default) before an OOM error is raised.

Memoria riservata di destinazioneTarget Committed Memory Percentuale disponibile per le tabelle in memoriaPercent available for in-memory tables
<= 8 GB<= 8 GB 70%70%
<= 16 GB<= 16 GB 75%75%
<= 32 GB<= 32 GB 80%80%
<= 96 GB<= 96 GB 85%85%
> 96 GB>96 GB 90%90%

Ad esempio, se la "memoria riservata alla destinazione" è di 100 GB e si stima che gli indici e le tabelle ottimizzate per la memoria richiedano 60 GB di memoria, è possibile creare un pool di risorse con MAX_MEMORY_PERCENT = 67 (60 GB necessari/0,90 = 66,667 GB - arrotondamento per eccesso a 67 GB; 67 GB/100 GB installato = 67%) per garantire i 60 GB di memoria necessari agli oggetti di OLTP in memoriaIn-Memory OLTP.For example, if your ‘target committed memory’ is 100 GB, and you estimate your memory-optimized tables and indexes need 60GBof memory, then you can create a resource pool with MAX_MEMORY_PERCENT = 67 (60GB needed / 0.90 = 66.667GB – round up to 67GB; 67GB / 100GB installed = 67%) to ensure that your OLTP in memoriaIn-Memory OLTP objects have the 60GB they need.

Dopo l'associazione di un database a un pool di risorse denominato, usare la query seguente per visualizzare le allocazioni di memoria tra pool di risorse diversi.Once a database has been bound to a named resource pool, use the following query to see memory allocations across different resource pools.

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  

In questo esempio campione viene illustrato che la memoria usata dagli oggetti ottimizzati per la memoria è 1356 MB nel pool di risorse, PoolIMOLTP, con un limite superiore di 2307 MB.This sample output shows that the memory taken by memory-optimized objects is 1356 MB in resource pool, PoolIMOLTP, with an upper bound of 2307 MB. Il limite superiore controlla la memoria totale che può essere usata dagli oggetti ottimizzati per la memoria di utente e sistema dei quali è stato eseguito il mapping a questo pool.This upper bound controls the total memory that can be taken by user and system memory-optimized objects mapped to this pool.

Esempio di output Sample Output
Questo output è tratto dal database e dalle tabelle create in precedenza.This output is from the database and tables we created above.

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  

Per altre informazioni, vedere sys.dm_resource_governor_resource_pools (Transact-SQL).For more information see sys.dm_resource_governor_resource_pools (Transact-SQL).

Se il database non viene associato a un pool di risorse denominato, viene associato al pool predefinito ('default').If you do not bind your database to a named resource pool, it is bound to the ‘default’ pool. Poiché il pool di risorse predefinito è usato da SQL ServerSQL Server per la maggior parte delle altre allocazioni, non sarà possibile monitorare in modo accurato la memoria usata dalle tabelle ottimizzate per la memoria tramite la DMV sys.dm_resource_governor_resource_pools per il database di interesse.Since default resource pool is used by SQL ServerSQL Server for most other allocations, you will not be able to monitor memory consumed by memory-optimized tables using the DMV sys.dm_resource_governor_resource_pools accurately for the database of interest.

Vedere ancheSee Also

sys.sp_xtp_bind_db_resource_pool (Transact-SQL) sys.sp_xtp_bind_db_resource_pool (Transact-SQL)
sys.sp_xtp_unbind_db_resource_pool (Transact-SQL) sys.sp_xtp_unbind_db_resource_pool (Transact-SQL)
Resource Governor Resource Governor
Pool di risorse di Resource Governor Resource Governor Resource Pool
Creare un pool di risorse Create a Resource Pool
Modificare le impostazioni del pool di risorse Change Resource Pool Settings
Eliminare un pool di risorseDelete a Resource Pool