Cuando se tienen servidores ejecutando SQL server que están en versiones anteriores a la 2014. Usualmente estos servidores están ejecutando en equipos de hardware que no es de los más nuevos y que contiene capacidades limitadas en cuanto a procesamiento, en estos casos es común que las empresas puedan adquirir nuevos equipos con mayores capacidades y es en este punto en cuanto se dan la oportunidad de ejecutar proyectos de consolidación de bases de datos, en el caso de SQL server se cuenta con distintas opciones para poder consolidar dichas bases de datos una de las primeras opciones con las que cuentan las personas es adquirir un equipo con grandes capacidades y poder instalar una instancia por de SQL server y dentro de esa instancia instalar todas las bases de datos que estaban en equipos legados, sin embargo también se pueden optar por otras opciones tales como la creación de diferentes instancias de bases de datos en este caso SQL server para albergar cada una de las aplicaciones o de las distintas aplicaciones que estaban en los servidores legados, otro de los enfoques es poder utilizar las capacidades de visualización, en el caso de visualización lo que se puede hacer es crear máquinas virtuales que ejecutan dentro de Windows server 2012 R2 y dentro de cada una de sus máquinas virtuales instalar una instancia de SQL server, en el caso de visualización nos ofrece el nivel más alto de aislamiento de los servidores puesto que tanto el sistema operativo como la instalación de SQL server son independientes y la configuración puede ser realizada en forma específica para cada uno de los servidores y las aplicaciones que lo van estar utilizando, debemos recordar que cuando se utiliza visualización basada en Microsoft se recomienda utilizar el System Center Virtua Machine Manager.

En el caso de consolidar todas las bases de datos en una única instancia se va llegar a la necesidad de poder establecer prioridades en cuanto a la ejecución de las consultas y el uso de los recursos del servidor físico o virtual, en este caso SQL server 2014 nos ofrece la opción de poder utilizar el gobierno de recursos conocido en inglés como Resource Governor.

El gobierno de recursos en SQL server 2014 se establece a nivel de instancia y permite poder establecer la contención para recursos tales como procesador, memoria y disco de forma tal de que se puedan compartir y establecer prioridades de estos aspectos de equipo compartidos entre diferentes bases de datos que ejecutan dentro de la misma instancia.

Cuando se desean establecer prioridades de ejecución para distintas bases de datos en un instancia de SQL server se utiliza el gobierno recursos en el cual se tiene que configurar primero varios pasos el el primer paso es crear un pool de recursos después establecer grupos de carga de trabajo y finalmente establecer una función de clasificación. La función de clasificación nos permite establecer la forma en que se haga asignar las prioridades de recursos de SQL server, o sea establecer cuál es el criterio para dar mayor prioridad en cuanto a uso de procesador, memoria y acceso al disco.

La forma más sencilla de poder hacer la configuración de el gobierno de recursos en SQL server es mediante la ejecución de scripts de T-SQL, el siguiente es un ejemplo de un script que se puede utilizar para poder configurar el gobierno de recursos en SQL server.

El primer paso es crear las definiciones de los pool de recursos, en el siguiente ejemplo se crean dos pool de recursos uno que establece baja prioridad y otro que establece alta prioridad, estos pool de recursos después van a ser utilizados durante la configuración del gobierno de recursos de SQL server. Un ejemplo se muestra se establecen los límites de uso de CPU y memoria para cada uno de los pool de recursos estos parámetros son distintos para el pool de baja prioridad con respecto al punto de alta prioridad estos un que han sido creados en este momento van a ser utilizados de forma posterior para la creación de los grupos que establecen las cargas de trabajo con los cuales se va configurar el gobierno de recursos en SQL server.

Use master;
CREATE RESOURCE POOL [baja prioridad]
   WITH(min_cpu_percent=0,
        max_cpu_percent=15,
        min_memory_percent=0,
        max_memory_percent=15);

CREATE RESOURCE POOL [alta prioridad] WITH(min_cpu_percent=20,
        max_cpu_percent=85,
        min_memory_percent=50,
        max_memory_percent=85);

El siguiente paso corresponde a la creación de las cargas de trabajo, en los siguientes scripts se crean dos definiciones de carga de trabajo, una definición va ser utilizada para los recursos que requiere alta prioridad y la otra para los recursos que requieren baja prioridad, por ejemplo en la carga de trabajo A, se esta estableciendo como una carga de trabajo de baja prioridad, esto se puede apreciar en la asignación de tiempo de CPU asignado y la asignación de cantidad de uso de memoria asignado a los trabajos que están clasificados dentro de este tipo de carga de trabajo.

CREATE WORKLOAD GROUP [CargaTrabajoA] WITH(group_max_requests=10,
        importance=Low,
        request_max_cpu_time_sec=15,
        request_max_memory_grant_percent=15,
        request_memory_grant_timeout_sec=15,
        max_dop=1) USING [baja prioridad];

CREATE WORKLOAD GROUP [CargaTrabajoB] WITH(group_max_requests=100,
        importance=High,
        request_max_cpu_time_sec=85,
        request_max_memory_grant_percent=85,
        request_memory_grant_timeout_sec=40,
        max_dop=4) USING [alta prioridad];

Después de haber creado las cargas de trabajo se debe realizar el siguiente comando para qué el gobernador de recursos se configure con respecto a lo que nosotros hemos establecido con los comandos anteriores de SQL server.

ALTER RESOURCE GOVERNOR RECONFIGURE;
GO

Una vez creadas los pool es de recursos y las cargas de trabajo es necesario crear un recurso conocido como función de clasificación, la función de clasificación es la forma en la cual SQL server se va a dar cuenta sobre cual carga de trabajo tiene que ser asignada a un estatuto específico o a una base de datos en específico, por ejemplo en el siguiente script se está creando una función de clasificación de gobierno de recursos cuyo criterio está basado en el nombre de la base datos, por ejemplo a la base datos de finanzas se está asignando la carga de trabajo tipo B y a la base datos de recursos humanos se le asigna la carga de trabajo tipo A, podemos recordar que esta última carga de trabajo tiene asignado baja prioridad.

CREATE FUNCTION dbo.fn_clasificacion_gobierno_recursos() RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @retval sysname = ‘Default’;
    IF (ORIGINAL_DB_NAME() = ‘BD_FINANZAS’)
        SET @retval = ‘CargaTrabajoB’;
    IF (ORIGINAL_DB_NAME() = ‘BD_RH’)
        SET @retval = ‘CargaTrabajoA’;   
    RETURN @retval;
END
GO

Finalmente tenemos que configurar el gobierno de recursos de SQL server para que utilicen la función de criterios de gobierno de desempeño que han sido definidos anteriormente.

ALTER RESOURCE GOVERNOR
    WITH (CLASSIFIER_FUNCTION = dbo.fn_clasificacion_gobierno_recursos);
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO

En resumen podemos decir que SQL server 2014 cuenta con las funcionalidades para poder establecer rivalidades con respecto al uso de recursos, lo cual es muy útil cuando dentro de una misma instancia se están ejecutando bases de datos donde una de las cuales necesita mayor acceso o prioridad de acceso a los recursos con respecto a las otras bases de datos, de esta forma podemos asignar mayores recursos a una base de datos esto sin dejar de poder ejecutar las operaciones del resto de base de datos solo que van a ser ejecutadas con una prioridad menor.

 

Saludos,

Ing. Eduardo Castro, PhD

Microsoft SQL Server MVP

Comunidad Windows Costa Rica

http://tinyurl.com/comunidadwindows