Vincular una base de datos con tablas optimizadas para memoria a un grupo de recursos

Se aplica a:SQL Server

Un grupo de recursos representa un subconjunto de recursos físicos que se puede administrar. De forma predeterminada, las bases de datos de SQL Server están enlazadas a los recursos del grupo de recursos de servidor predeterminado y los consumen. Para proteger SQL Server de manera que una o más tablas optimizadas para memoria no consuman sus recursos, y evitar que otros usuarios consuman memoria que las tablas optimizadas para memoria necesitan, debe crear un grupo de recursos de servidor diferente para administrar el consumo de memoria para la base de datos con tablas optimizadas para memoria.

Una base de datos solo puede estar vinculada a un único grupo de recursos. Sin embargo, puede enlazar varias bases de datos al mismo grupo. SQL Server permite enlazar una base de datos sin tablas optimizadas para memoria a un grupo de recursos de servidor, pero ello no tiene ningún efecto. Es posible que desee vincular una base de datos a un grupo de recursos con nombre si, en el futuro, desea crear tablas optimizadas para memoria en la base de datos.

Para poder enlazar una base de datos a un grupo de recursos de servidor, tanto la base de datos como el grupo de recursos de servidor deben existir. El enlace surte efecto la próxima vez que la base de datos pase a estar en línea. Consulte Database States para obtener más información.

Para obtener información sobre los grupos de recursos, vea Resource Governor Resource Pool.

Pasos para vincular una base de datos a un grupo de recursos

  1. Crear la base de datos y la reserva de recursos

    1. Crear la base de datos

    2. Determinar el valor mínimo de MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT

    3. Crear un grupo de recursos de servidor y configurar la memoria

  2. Enlazar la base de datos al grupo

  3. Confirmar el enlace

  4. Activar el enlace

Otro contenido de este tema

Crear la base de datos y el grupo de recursos

Puede crear la base de datos y el grupo de recursos en cualquier orden. Lo que importa es que ambos elementos existan antes de vincular la base de datos al grupo de recursos.

Creación de la base de datos

El siguiente Transact-SQL crea una base de datos denominada IMOLTP_DB que contendrá una o varias tablas optimizadas para memoria. La ruta de acceso <driveAndPath> debe existir antes de ejecutar este comando.

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  

Determinar el valor mínimo de MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT

Una vez que determine las necesidades de memoria para las tablas optimizadas para memoria, debe determinar qué porcentaje de memoria disponible se necesita y establecer los porcentajes de memoria en ese valor o uno superior.

Ejemplo:
En este ejemplo supondremos que en sus cálculos ha determinado que las tablas y los índices optimizados para memoria necesitan 16 GB de memoria. Suponga que tiene 32 GB de memoria asignada para su uso.

A primera vista, podría parecer que necesita establecer MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT en 50 (16 es el 50 % de 32). Sin embargo, eso no proporcionaría suficiente memoria a las tablas optimizadas para memoria. Si miramos la tabla siguiente (Porcentaje de memoria disponible para tablas e índices optimizados para memoria), vemos que si hay 32 GB de memoria asignada, solo el 80 % está disponible para tablas e índices optimizados para memoria. Por tanto, calculamos los porcentajes mínimo y máximo en función de la memoria disponible, no de la memoria asignada.

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

Es decir, en números reales sería:
percentNeeded = 16 / (32 * 0.8) = 16 / 25.6 = 0.625

Por lo tanto, necesita al menos el 62,5 % de la memoria disponible para cumplir el requisito de 16 GB de sus tablas e índices optimizados para memoria. Puesto que los valores de MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT deben ser enteros, los estableceremos como mínimo en el 63 %.

Crear un grupo de recursos de servidor y configurar la memoria

A la hora de configurar memoria para las tablas optimizadas para memoria, el planeamiento de capacidad debe realizarse en función de MIN_MEMORY_PERCENT, no de MAX_MEMORY_PERCENT. Consulte ALTER RESOURCE POOL (Transact-SQL) para obtener información sobre MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT. Esto proporciona una disponibilidad de memoria más predecible para las tablas optimizadas para memoria, ya que MIN_MEMORY_PERCENT genera presión de memoria en otros grupos de recursos para garantizar que se respete el valor configurado. Para asegurarse de que hay memoria disponible e impedir condiciones de memoria insuficiente, los valores de MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT deben ser iguales. Vea la tabla Porcentaje de memoria disponible para tablas e índices optimizados para memoria de abajo para conocer el porcentaje de memoria disponible para las tablas optimizadas para memoria según la cantidad de memoria asignada.

Vea Prácticas recomendadas: usar OLTP en memoria en un entorno de máquinas virtuales para obtener más información sobre cómo trabajar en un entorno de máquinas virtuales.

El siguiente Transact-SQL crea un grupo de recursos denominado Pool_IMOLTP con la mitad de memoria disponible para su uso. Una vez creado el grupo, hay que reconfigurar el Regulador de recursos para incluir 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  

Vincular la base de datos al pool

Use la función del sistema sp_xtp_bind_db_resource_pool para vincular la base de datos al grupo de recursos. La función toma dos parámetros: el nombre de la base de datos y el nombre del grupo de recursos.

El siguiente Transact-SQL define un enlace de la base de datos IMOLTP_DB con el grupo de recursos de servidor Pool_IMOLTP. La vinculación no se hace efectiva hasta que pongas la base de datos en línea.

EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'Pool_IMOLTP'  
GO  

La función del sistema sp_xtp_bind_db_resource_pool toma dos parámetros de cadena: database_name y pool_name.

Confirmar la vinculación

Confirme la vinculación, anotando el identificador del grupo de recursos para IMOLTP_DB. No puede ser NULL.

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

Hacer efectiva la vinculación

Debe poner la base de datos sin conexión y volver a ponerla en línea después de vincularla al grupo de recursos para que la vinculación surta efecto. Si la base de datos estaba vinculada anteriormente a un grupo de recursos diferente, esto retira la memoria asignada del grupo de recursos anterior, y las asignaciones de memoria para la tabla optimizada para memoria y sus índices provendrán ahora del grupo de recursos al que se acaba de vincular la base de datos.

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

Ahora, la base de datos está vinculada al grupo de recursos.

Cambiar MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT en un grupo existente

Si agrega memoria adicional al servidor o si cambia la cantidad de memoria necesaria para las tablas optimizadas para memoria, puede ser necesario modificar el valor de MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT. Los pasos siguientes muestran cómo modificar el valor de MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT en un grupo de recursos de servidor. Vea la próxima sección para obtener información sobre qué valores se deben usar para MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT. Vea el tema Prácticas recomendadas: usar OLTP en memoria en un entorno de máquinas virtuales para obtener más información.

  1. Utilice ALTER RESOURCE POOL para cambiar el valor de MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT.

  2. Use ALTER RESOURCE GOVERNOR para reconfigurar el regulador de recursos con los nuevos valores.

Código de ejemplo

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

Porcentaje de memoria disponible para tablas e índices optimizados para memoria

Si asigna una base de datos con tablas optimizadas para memoria y una carga de trabajo de SQL Server al mismo grupo de recursos de servidor, el regulador de recursos establece un umbral interno para uso de OLTP en memoria de modo que los usuarios del grupo no experimenten conflictos al usar el grupo. En general, el umbral para usar In-Memory OLTP es aproximadamente el 80 % del grupo. En la tabla siguiente se muestran los umbrales reales para diversos tamaños de memoria.

Al crear un grupo dedicado de recursos para la base de datos OLTP en memoria, debe estimar cuánta memoria física necesita para las tablas en memoria después de contabilizar las versiones de fila y el crecimiento de los datos. Una vez que se calcula la memoria necesaria, se crea un grupo de recursos con un porcentaje de la memoria de destino de confirmación para la instancia de SQL, tal como se refleja en la columna "committed_target_kb" de la DMV sys.dm_os_sys_info. Por ejemplo, puede crear un grupo de recursos de servidor P1 con el 40 % de la memoria total disponible para la instancia. De este 40 %, al motor OLTP en memoria se le asigna un porcentaje menor para almacenar datos OLTP en memoria. Esto se hace para asegurarse de que OLTP en memoria no usa toda la memoria de este grupo. Este valor del porcentaje más pequeño depende de la memoria comprometida objetivo. En la siguiente tabla se describe la memoria disponible para una base de datos con OLTP en memoria en un grupo de recursos (con nombre o predeterminado) antes de que se produzca un error de OOM.

Memoria asignada de destino Porcentaje disponible para tablas en memoria
<= 8 GB 70%
<= 16 GB El 75 %
<= 32 GB 80%
<= 96 GB 85 %
>96 GB 90 %

Por ejemplo, si la "memoria confirmada de destino" es de 100 GB y calcula que las tablas e índices optimizados para memoria necesitan 60 GB de memoria, puede crear un grupo de recursos de servidor con MAX_MEMORY_PERCENT = 67 (60 GB necesarios / 0,90 = 66,667 GB - redondear hasta 67 GB; 67 GB / 100 GB instalados = 67 %) para garantizar que los objetos de OLTP en memoria tengan los 60 GB que necesitan.

Una vez que una base de datos se ha enlazado a un grupo de recursos de servidor con nombre, utilice la consulta siguiente para ver las asignaciones de memoria en distintos grupos de recursos de servidor.

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  

Esta salida de ejemplo muestra que la memoria usada por los objetos optimizados para memoria es de 1356 MB en el grupo de recursos de servidor, PoolIMOLTP, con un límite superior de 2307 MB. Este límite superior controla la memoria total que el usuario puede emplear y los objetos del sistema optimizados para memoria asignados a este grupo.

Salida de ejemplo
Esta salida es de la base de datos y las tablas que hemos creado antes.

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         Pool_IMOLTP 0                  100                3845          1356           2307  

Para más información, consulte sys.dm_resource_governor_resource_pools (Transact-SQL).

Si no asocia la base de datos a un grupo de recursos con nombre, queda asociada al grupo "default". Puesto que SQL Server usa el grupo de recursos de servidor predeterminado para la mayoría de las demás asignaciones, no podrá supervisar con precisión la memoria usada por las tablas optimizadas para memoria mediante la DMV sys.dm_resource_governor_resource_pools para la base de datos de interés.

Consulte también

sys.sp_xtp_bind_db_resource_pool (Transact-SQL)
sys.sp_xtp_unbind_db_resource_pool (Transact-SQL)
Regulador de recursos
Grupo de recursos del Gobernador de recursos
Crear un grupo de recursos
Cambiar la configuración del grupo de recursos
Eliminar un grupo de recursos