jueves, 30 de noviembre de 2017

SQL Server Consultas Dinámicas

Consultas Dinámicas en Microsoft SQL Server

Introducción

Hoy hablare de las consultas dinámicas, su funcionamiento y las prácticas que deben tenerse para lograr un buen desempeño. Antes de iniciar, veremos la definición de una consulta dinámica desde el punto de vista de Microsoft. Una consulta dinámica es código SQL que es generado programáticamente (en parte o totalmente) por un programa antes de que sea ejecutado. Esto es, durante la ejecución de un procedimiento almacenado, se lleva a cabo la creación de un comando de consulta, de tal forma que, antes de que termine la ejecución del procedimiento se ejecuta la consulta generada con las características requeridas.

Desarrollo

Por ejemplo, tenemos la siguiente consulta:

-- Declarar parametros
DECLARE @IdCategory         nvarchar(7)   = NULL
          ,@IdUnitMeasure   smallint      = 1
          ,@IdCurrency      smallint      = NULL

-- Establece consulta
SELECT Category
         ,Classification
         ,BrandName
         ,IdProduct
         ,[Description]
         ,PartNumber
         ,ISNULL(InventoryActual, 0) InventoryActual
         ,IsSerializable
  FROM Catalog.VProduct
 WHERE (IdCategory = @IdCategory OR @IdCategory IS NULL)
   AND (IdCurrency = @IdCurrency OR @IdCurrency IS NULL)
   AND (IdUnitMeasure = @IdUnitMeasure OR @IdUnitMeasure IS NULL)
 ORDER BY DisplayOrder, Classification, BrandName, IDProduct


Es posible notar que se ha generado una consulta que tiene 3 condiciones de filtro que pueden ser indicados con nulos, de tal forma que en este caso las condiciones de IdCategory y IdCurrency se han indicado con nulo y solo IdUnitMeasure se ha especificado con valor, esta consulta puede ser generada dinámicamente para que solo sea ejecutada la condición deseada, de la siguiente forma:

-- Declarar parametros
DECLARE @IdCategory         nvarchar(7)   = NULL
          ,@IdUnitMeasure   smallint      = 1
          ,@IdCurrency      smallint      = NULL

-- Declarar variables
DECLARE @SqlText nvarchar(1000)
DECLARE @cond int = 0

-- Genera Consulta Dinamica
SET @SqlText = N'SELECT Category
         ,Classification
         ,BrandName
         ,IdProduct
         ,[Description]
         ,PartNumber
         ,ISNULL(InventoryActual, 0) InventoryActual
         ,IsSerializable
  FROM [Catalog].VProduct
 WHERE ';
 IF @IdCategory IS NOT NULL
 BEGIN
       SET @SqlText += N' IdCategory = ''' + @IdCategory +'';
       SET @cond +=1;
END
IF @IdCurrency IS NOT NULL
BEGIN
       IF @cond > 0 SET @SqlText += N' AND ';
    SET @SqlText += N'IdCurrency = ' + CAST(@IdCurrency as nvarchar);
    SET @cond += 1;
END
IF @IdUnitMeasure IS NOT NULL
BEGIN
       IF @cond > 0 SET @SqlText += N' AND ';
       SET @SqlText += N'IdUnitMeasure = ' + CAST(@IdUnitMeasure as nvarchar);
END

SET @SqlText += N' ORDER BY DisplayOrder, Classification, BrandName, IDProduct';



Este código genera el comando siguiente para la consulta:

SELECT Category
         ,Classification
         ,BrandName
         ,IdProduct
         ,[Description]
         ,PartNumber
         ,ISNULL(InventoryActual, 0) InventoryActual
         ,IsSerializable
  FROM [Catalog].VProduct
 WHERE IdUnitMeasure = 1 ORDER BY DisplayOrder, Classification, BrandName, IDProduct

La ejecución de esta consulta dinámica se lleva a cabo con el comando EXEC, como se indica a continuación:

EXEC (@SqlText)

Hasta aquí, la ejecución de la consulta dinámica se hace sencilla, sin embargo, esta ejecución tiene un problema, no se guarda el plan de ejecución, ya que se ha establecido con el uso del comando EXEC que se ejecute como única vez, además de que la consulta no tiene parámetros, se han sustituido los valores de los parámetros en la consulta. Ahora si queremos que la consulta se ejecute y se mantenga un plan de ejecución será necesario hace unas pequeñas modificaciones al código anterior, para quedar:

-- Declarar parametros
DECLARE @IdCategory         nvarchar(7)   = NULL
          ,@IdUnitMeasure   smallint      = 1
          ,@IdCurrency      smallint      = NULL

-- Declarar variables
DECLARE @SqlText nvarchar(1000)
DECLARE @cond int = 0

-- Genera Consulta Dinamica
SET @SqlText = N'SELECT Category
         ,Classification
         ,BrandName
         ,IdProduct
         ,[Description]
         ,PartNumber
         ,ISNULL(InventoryActual, 0) InventoryActual
         ,IsSerializable
  FROM [Catalog].VProduct
 WHERE ';
 IF @IdCategory IS NOT NULL
 BEGIN
       SET @SqlText += N' IdCategory = @IdCat ';
       SET @cond +=1;
END
IF @IdCurrency IS NOT NULL
BEGIN
    IF @cond > 0 SET @SqlText += N' AND ';
    SET @SqlText += N'IdCurrency = @IdCur ';
    SET @cond += 1;
END
IF @IdUnitMeasure IS NOT NULL
BEGIN
       IF @cond > 0 SET @SqlText += N' AND ';
       SET @SqlText += N'IdUnitMeasure = @IdUnit ';
END

SET @SqlText += N' ORDER BY DisplayOrder, Classification, BrandName, IDProduct';

-- Ejecuta consulta dinamica
EXEC sp_executesql @statement = @SqlText,
                                  @params = N'@IdCat nvarchar(7), @IdUnit smallint, @IdCur smallint',
                                  @IdCat = @IdCategory,
                                  @IdUnit = @IdUnitMeasure,
                                  @IdCur = @IdCurrency


Se observa que se ha incluido una llamada a un procedimiento almacenado del sistema que se denomina sp_executesql, este procedimiento ejecuta una instrucción de Transact-SQL o un lote de instrucciones que puede reutilizarse muchas veces, o uno que se ha generado dinámicamente, como es el caso anterior. La instrucción o lote de Transact-SQL puede contener parámetros incorporados, como se ha indicado en el ejemplo.
En la declaración del procedimiento almacenado se pueden identificar tres componentes principales de parámetros, el que se identifica como @statement que es el que se asocia con la consulta dinámica, @params que debe contener todos los parámetros que puedes ser utilizados en la consulta dinámica y por último cada uno de los parámetros indicados con su valor correspondiente. En el caso de nuestro ejemplo se tienen tres posibles parámetros y se declaran 3 posibles valores.
Es importante mencionar que, la ejecución de la consulta dinámica utilizando el procedimiento almacenado del sistema, permite mantener el plan de ejecución de la consulta dinámica en memoria, ya que al poder manejar parámetros, estos permiten la reutilización de la consulta, solo cambiará el valor del parámetro, de esta forma, para el ejemplo que tenemos, es posible que se mantengan 8 planes de ejecución, dependiendo de la presencia de los parámetros, con lo cual se hace mas eficiente el uso de la consulta dinámica.
Existe la posibilidad de que algún desarrollo requiera el uso de múltiples consultas dinámicas, lo que generara una gran cantidad de espacio para mantener los planes de ejecución de las mismas, es por ello que en estos casos conviene validar el valor de la opción de configuración denominada “optimize for ad hoc workloads”, está opción se usa para mejorar la eficacia de la memoria caché del plan para cargas de trabajo que contienen muchos lotes ad hoc de un solo uso. Cuando esta opción se establece en 1, el Motor de base de datos almacena un pequeño apéndice del plan compilado en la memoria caché de planes de ejecución cuando se compila un lote por primera vez, en lugar del plan completo compilado. Esto ayuda a aliviar la presión de la memoria al no permitir que la memoria caché del plan de ejecución se llene con planes compilados que no se reutilizan.

Conclusión


Las consultas dinámicas son muy útiles cuando se desean manejar consultas que requiere la presencia de varios parámetros, que pueden contener valores o bien la ausencia de ellos, en cualquier caso, la consulta debe obtener información. En nuestro caso se trata de una consulta que se utiliza para filtrar la presentación de la información.

miércoles, 15 de noviembre de 2017

SQL Server DBCC CLONEDATABASE

Comando DBCC CLONEDATABASE

Cuando inicie con los Comandos DBCC, mencione que dentro de la categoría de varios se encontraba este comando que crea una nueva base de datos que contiene el esquema de todos los objetos y estadísticas de la base de datos de origen especificada. Este comando es realmente una buena incorporación a los comandos de consola de base de datos que ha realizado Microsoft SQL Server, este comando inicia su funcionamiento en la versión Microsoft SQL Server 2017, aunque está presente en las versiones de Microsoft SQL Server 2012 en el paquete de servicio 4, Microsoft SQL Server 2014 en el paquete de servicio 2 y en Microsoft SQL Server 2016 en el paquete de servicio 1.

Es realmente importante notar que esta funcionalidad no está pensada para que la base de datos clonada se utilice en ambientes productivos ya que su principal objetivo es la resolución de problemas y diagnóstico. De tal forma que se recomienda que una vez que se ha generado la base de datos clonada, ésta sea separada del servidor y restaurada en algún otro servidor.
La sintaxis de este comando en su forma más simple es:

USE master;
GO
DBCC CLONEDATABASE (source_database_name, target_database_name);
Microsoft SQL Server llevara a cabo las acciones requeridas para hacer un clone de la base de datos identificada como source_database_name, generando la base de datos denominada target_database_name. Es importante notar que toda la información de la tarea solicitada se registrara en el registro de Microsoft SQL Server. Las acciones que se llevan a cabo incluyen la generación de la base de datos del tamaño especificado en la base de datos model, se establece el método de recuperación den SIMPLE, así como el método de verificación de página en CHECKSUM, la opción TRUSTWORTHY a OFF y DB_CHAINING a OFF para la base de datos identificada como target_database_name. Una vez que la operación se ha llevado a cabo, la base de datos identificada target_database_name quedara en el estado de solo lectura y se presentara la siguiente notificación en los resultados.

Database cloning for 'source_database_name' has started with target as 'target_database_name'.
Database cloning for 'source_database_name' has finished. Cloned database is 'target_database_name'.
Database 'source_database_name' is a cloned database. A cloned database should be used for diagnostic purposes only and is not supported for use in a production environment.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.


Se puede observar que el último mensaje de la ejecución del comando indica que la base de datos clonada solo debe ser  utilizada con propósitos de diagnóstico y no será soportada en un ambiente de producción.
En términos generales podemos decir que esta operación lleva a cabo las siguientes operaciones:
  •        Crea una nueva base de datos de destino con el nombre identificado en target_database_name, que utiliza el mismo diseño de archivo que la base de datos origen, pero con tamaños de archivo predeterminados como la base de datos model.
  •        Crea una instantánea interna de la base de datos origen, identificada como source_database_name, para poder extraer los metadatos correspondientes.
  •        Copia los metadatos del sistema de la base de datos origen, source_database_name, a la base de datos de destino, identificada como tarjet_database_name.
  •        Copia todos los esquemas para todos los objetos desde la base de datos origen hasta la base de datos destino.
  •        Copia las estadísticas para todos los índices desde el origen a la base de datos de destino. Aquí se ve la importancia de que esta base de datos deba ser utilizada con propósitos de diagnóstico.
Existen algunos argumentos opcionales que pueden ser utilizados con el comando, estos son:

NO_STATISTICS
Este argumento especifica si las estadísticas de tabla / índice deben excluirse en el clon. Si no se especifica esta opción, las estadísticas de tabla / índice se incluyen automáticamente. Esta opción está disponible comenzando con Microsoft SQL Server 2014 SP2 CU3 y Microsoft SQL Server 2016 Service Pack 1.
NO_QUERYSTORE
Este argumento especifica si el almacén de consultas necesita ser excluido en el clon. Si no se especifica esta opción, los datos del almacén de consultas se copian en el clon si están habilitados en la base de datos de origen. Esta opción está disponible comenzando con Microsoft SQL Server 2016 Service Pack 1.

Como se ha mencionado, este comando debe ser utilizado para crear una copia del esquema y las estadísticas de una base de datos de producción, para investigar los problemas de rendimiento de las consultas, por lo que es importante tomar en cuenta las restricciones y los objetos que son soportados en el uso de este comando, Microsoft ha indicado una serie de objetos que están permitidos para la clonación, mismos que están indicados en la documentación del comando. Las restricciones implican que el uso del comando genere mensajes de error y estas son:
  • La base de datos de origen siempre debe ser especificada para una base de datos de usuario. La clonación de bases de datos del sistema (master, model, msdb, tempdb, distribution database, etc.) no está permitida.
  • La base de datos de origen que se establece en el comando debe estar en línea o legible.
  • El nombre de la base de datos que se establece como de destino no debe existir previamente al uso del comando.
  • El comando no debe ser usado en una transacción de usuario.

Ejemplos de DBCC CLONEDATABASE

Mostraré algunos ejemplos de uso de este comando:

USE master;
GO
DBCC CLONEDATABASE (db1, db2);
Genera un clone de la base de datos indicada como db1 generando la base de datos indicada como db2, incluye el esquema, las estadísticas y en el caso de Microsoft SQL Server 2016 y posterior, también incluye el almacenamiento de consultas y deja la base de datos db2 en el estado de solo lectura.

USE master;
GO
DBCC CLONEDATABASE (AdventureWorks, AdventureWorks_Clone) WITH NO_STATISTICS;
Crea un clone de la base de datos AdventureWorks, solo el esquema, sin incluir las estadísticas, para el caso de Microsoft SQL Server 2014 y posterior,  pero incluye almacenamiento de consultas para Microsoft SQL Server 2016 y posterior.

USE master;
GO
DBCC CLONEDATABASE (db1, db1_Clone) WITH NO_STATISTICS, NO_QUERYSTORE;
Crea un clone de la base de datos db1, solo el esquema, sin incluir las estadísticas, ni el almacenamiento de consultas para Microsoft SQL Server 2016 y posterior. Este ejemplo no funcionará en versiones anteriores de Microsoft SQL Server 2016.

Comentarios

Este comando debe ser utilizado cuando se tiene un bajo desempeño de las consultas en una base de datos y se debe llevar a cabo un análisis para la resolución de los problemas y el diagnostico correspondiente, ya que como se ha visto se copia todo el esquema de la base de datos de destino y se permite mantener las estadísticas generadas con las consultas y los índices, así como el almacenamiento de las consultas, en las versiones de Microsoft SQL Server 2016 y posteriores.

Es necesario indicar que si bien existen argumentos que nos permiten generar únicamente la estructura, el uso de la base de datos clonada solo podrá servir para efectos de mantener una copia limpia de la base de datos original, la cual puede ser usada en otro servidor para desarrollo o pruebas.

lunes, 13 de noviembre de 2017

Conociendo SQL Server 2017

Incrementar la plataforma de datos e inteligencia artificial el reto

Recientemente instalé Microsoft SQL Server 2017 DE en mi equipo y pude constatar la cantidad de mejoras y nuevas características que se entregan con esta nueva versión de Microsoft SQL Server. Mas allá de decir que Microsoft SQL Server es líder en la industria debido a su tecnología in-memory en cuanto a rendimiento, se está dando un cambio muy importante en la parte de análisis, ya que se incluyen en la base de datos las opciones de Analítica Avanzada.
Microsoft SQL Server 2017 tiene las capacidades de manejo de datos tanto estructurados como no estructurados, el objetivo es que la industria perciba un producto capaz de brindar soluciones en una amplia gama. Dentro de los datos estructurados encontramos las bases de datos OLTP, las de mobile y las que contienen grandes objetos, sin olvidar la información que se obtiene a través de los ERP. Si hablamos de los datos no estructurados, encontraremos gráficos, social, internet de las cosas y media.

Si bien, se sabe que Microsoft SQL Server ya ha obtenido, desde hace tiempo, el liderazgo en el manejo de datos operacionales, también ha incrementado su liderazgo en lo relacionado al manejo de data warehouse. Es por ello que ha participado desde hace algún tiempo en lo que se denomina procesamiento de big data, a través de consultas de tipo T-SQL sobre cualquier tipo de datos, incluyendo Internet de las cosas y Hadoop. Con ello se logra una gran integración para el manejo de datos, colaborando en ambientes virtuales, locales y a través de una integración simple con Azure para manejo en la nube.
Desde la versión Microsoft SQL Server 7.0, se ha mantenido un gran compromiso, por parte de Microsoft, de proporcionar las herramientas que permitan llevar a cabo la denominada Inteligencia de Negocios (BI), la aparición de las bases de datos OLAP y la herramienta de transformación de datos (DTS), se ha ido incrementando con las nuevas versiones, si bien la herramienta de transformación de datos se convirtió en una verdadera herramienta de extracción, transformación y carga de datos ahora denominada Integration Services, que se había mantenido como una herramienta que no se escalaba, no soportaba instalación en clúster, ahora ya se puede escalar a través del mecanismo Integration Services Scale Out que proporciona la ejecución de paquetes de alto rendimiento mediante la distribución de ejecuciones a varias máquinas. Las bases de datos de OLAP se transformaron para ofrecer ahora lo que se denomina Analysis Services, siendo que ahora no solo se manejan bases de datos multidimensionales, desde la versión Microsoft SQL Server 2012 se pueden manejar esquemas tabulares, también se ha integrado el modo de PowerPivot desde la versión Microsoft SQL Server 2016, que básicamente está dirigido a completar las capacidades de SharePoint. Se completa la oferta de herramientas para Inteligencia de Negocio a través de Reporting Services, una herramienta que apareció en 2002/2003 para la versión de Microsoft SQL Server 2000, que ya permite la integración con el producto PowerBI para obtener mejores documentos.

Con estas características de Inteligencia de Negocio que he mencionado, se han incorporado dos elementos importantes para lograr capacidades de Analítica Avanzada e inteligencia artificial, a través del soporte los lenguajes R y Python. El lenguaje R, que ya se había incluido en la versión Microsoft SQL Server 2016, bajo el concepto de SQL Server R Services (In-Database), para la integración con Microsoft SQL Server y Microsoft R Server, para implementaciones R a nivel empresarial en servidores Windows y Linux, en la versión Microsoft SQL Server 2017, estos servicios cambian de nombre a SQL Server Machine Learning Services (In-Database) que ahora soporta R y Python para análisis en la base de datos y Microsoft Machine Learning Server que admite implementaciones R y Python en Windows, Linux y HDInsight Spark y Hadoop clúster.  Con esto Microsoft refuerza su compromiso de brindar las herramientas necesarias para generar la información de datos requerida por las empresas.
El motor de base de datos de Microsoft SQL Server ya permite una mejora en el rendimiento de las consultas sin llevar a cabo una afinación a través del uso de lo que se conoce como Adaptive Query Processing, asimismo permite que las transacciones sean más rápidas con el uso de la tecnología In-Memory OLTP, que se presentó en la versión Microsoft SQL Server 2014, y hasta 100 veces más rápida con el uso de in-memory Columnstore. De igual forma, las operaciones analíticas en tiempo real se mejoran cuando se combinan con las tecnologías in-memory.

Microsoft siempre se ha preocupado por la seguridad de los datos, por ello se han desarrollado mecanismos que nos permitan proteger los datos, en esta versión de Microsoft SQL Server 2017, se han mejorado los servicios de protección de datos con Always Encrypted, esto permite que los datos se mantengas encriptados mientras están en la base de datos y cuando se encuentran en transporte, serán visibles al usuario final de acuerdo siempre que se mantenga la llave correspondiente para la des-encriptación. De similar forma puede ser usada la característica Dynamic Data Masking para ocultar los datos sensibles. Finalmente, es posible mantener un control de acceso a cada uno de los registros en la base de datos a través del mecanismo denominado Row-Level Security.
En lo referente a grupos de alta disponibilidad, en Always On, que aparece en la versión Microsoft SQL Server 2012, para completar la oferta de alta disponibilidad y recuperación de desastres, donde las transacciones de bases de datos cruzadas ahora son compatibles entre todas las bases de datos que forman parte de un grupo de disponibilidad permanente, incluidas las bases de datos que forman parte de la misma instancia. La nueva funcionalidad de grupos de disponibilidad ahora incluye compatibilidad sin clústeres, cumpliendo con algunas restricciones, la configuración de grupos de disponibilidad de réplica mínima y migraciones y pruebas a través de sistemas operativos Windows-Linux.

Ya mencionamos las operaciones analíticas en tiempo real, las cuales se logran con el uso de alguno de los lenguajes R o Python que ya se manejan en Microsoft SQL Server 2017, con ello podremos escalar y acelerar a través de machine learning generando la inteligencia a donde los datos viven con los servicios in-database R and Python analytics. Las cuales pueden ser paralelizadas y escaladas. De esta forma, Microsoft SQL Server se mantiene como líder en la innovación de Inteligencia Artificial para descubrir la información más rápido, usando algoritmos avanzados de aprendizaje automático con GPU.
Microsoft SQL Server ahora permite la consulta y datos con soporte de gráficos, el almacenamiento y análisis de relaciones no-jerárquicas se logra a través de soporte de datos gráficos. Se mantiene y refuerza el uso de PolyBase, incluido inicialmente en la versión Microsoft SQL Server 2016, para consultar fácilmente en Microsoft SQL Server y datos almacenados en Hadoop. Ya que permite que un profesional de Microsoft SQL Server trabaje con datos de Hadoop utilizando herramientas conocidas como SQL Server Management Studio, herramientas de datos de Microsoft SQL Server, Microsoft Office y Power BI con el lenguaje Transact-SQL y las extensiones incluidas.  Así, Hadoop combinado con Microsoft SQL Server proporciona valor y conocimiento de los lagos de datos

Con Microsoft SQL Server 2017 se representa un paso importante para convertir Microsoft SQL Server en una plataforma que le ofrece opciones de lenguajes de desarrollo, tipos de datos, locales o en la nube, y sistemas operativos al llevar la potencia de Microsoft SQL Server a Linux, contenedores Docker basados en Linux y Windows. Asimismo, ahora podemos instalar en cualquier nube y cualquier plataforma, incluyendo OpenShift, Red Hat OpenStack, Kubernetes, Docker Swarm, Pivotal y por supuesto Azure.
De esta forma, podemos decir que Microsoft SQL Server es una suite de herramientas que permite resolver problemas mayores con conocimientos empresariales más rápidos y de gran alcance. Empleando soluciones líderes para OLTP, almacenamiento de datos, análisis avanzado y BI. Permite la innovación con cualquier lenguaje y cualquier dato en cualquier plataforma.

Este documento pretende dar una introducción rápida a las nuevas características y funcionalidades que se presentan con Microsoft SQL Server 2017, si bien se han mencionado solo unas cuantas, en posteriores entregas iré ampliando y ejemplificando como puede aprovecharse.

viernes, 10 de noviembre de 2017

SQL Server DBCC FREESESSIONCACHE y FREESYSTEMCACHE

Comandos DBCC FREESESSIONCACHE y FREESYSTEMCACHE

Ya se ha indicado, cuando comencé con los Comandos DBCC, sobre los comandos misceláneos, que existen estos dos comandos que nos ayudan a la limpieza del espacio denominado cache, uno para el relacionado con las conexiones generadas por las consultas distribuidas y otro para liberar toda el espacio de cache que no se esté utilizando en el sistema.

DBCC FREESESSIONCACHE


Este comando lleva a cabo el vaciado de la caché de conexión de consulta distribuida que se utiliza por las consultas distribuidas en una instancia de Microsoft SQL Server. Pero, ¿qué significa esto? Es importante indicar que muchas veces se llevan a cabo consultas que implican la existencia de datos en diferentes servidores y esto genera un espacio de cache para mantener la conexión de datos, en este sentido, este comando solo es útil cuando se llevan a cabo consultas distribuidas, ya que se liberará el espacio ocupado por la realización de este tipo de consultas.
La sintaxis que se usa para este comando es:

DBCC FREESESSIONCACHE;
Este comando libera el cache de consultas distribuidas utilizado en la base de datos actual. 

Existe un argumento opcional que puede ser utilizado con el comando, éste es:

WITH NO_INFOMSGS
Suprime todos los mensajes informativos.

DBCC FREESYSTEMCACHE

Ya se ha indicado que éste comando libera todas las entradas de caché no utilizadas de todas las memorias caché. Esto es, el Motor de base de datos de Microsoft SQL Server limpia de forma automática y en segundo plano todas las entradas de caché no utilizadas, lo que permite que haya memoria disponible para las entradas actuales. No obstante, es posible utilizar este comando para liberar de forma manual las entradas no usadas de todas las memorias caché o de una memoria caché especifica de un grupo del regulador de recursos.
La sintaxis que se usa más a menudo para este comando es:

DBCC FREESYSTEMCACHE ('ALL');
En este caso se indica que se libere el espacio de cache utilizado por todas las memorias compatibles. 

Existen algunos argumentos opcionales que puede ser utilizado con el comando, los cuales son:

Pool_name
Especifica una cache de grupo del regulador de recursos, de tal forma que solo se liberaran las entradas asociadas a este grupo, se utiliza en conjunto con ‘ALL’.
MARK_IN_USE_FOR_REMOVAL
Libera asincrónicamente las entradas utilizadas actualmente de sus respectivas cachés después de que dejan de utilizarse. No se verán afectadas las nuevas entradas creadas en la memoria caché después de ejecutar el comando.
WITH NO_INFOMSGS
Suprime todos los mensajes informativos.


Ejemplos de DBCC FREESYSTEMCACHE


Mostraré algunos ejemplos de uso de este comando:

DBCC FREESYSTEMCACHE ('ALL', default); 
Se limpiará la memoria caché que está dedicada a un grupo de recursos de servidor del regulador de recursos denominado default.

DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL; 
En este ejemplo, se utiliza la cláusula MARK_IN_USE_FOR_REMOVAL para liberar las entradas de todas las memorias caché actuales una vez que las entradas dejen de ser utilizadas.

Comentarios


Si bien, el uso del comando DBCC FREESESSIONCACHE puede ser uno de los menos utilizados, conviene tenerlo presente cuando se trabaja con consultas distribuidas. No hay nada más que señalar con respecto a este comando.
Ahora bien, el uso del comando DBCC FREESYSTEMCACHE al borrar la memoria caché de planes, se provoca que se lleve a cabo la nueva compilación de todos los planes de ejecución posteriores y puede ocasionar una disminución repentina y temporal del rendimiento de las consultas. Para cada uno de los almacenes de caché que se ha borrado de la caché del plan, el registro de Microsoft SQL Server contendrá el siguiente mensaje informativo: " SQL Server ha detectado %d instancias de vaciado del almacén de caché '%s' (parte de la caché del plan) debido a operaciones 'DBCC FREEPROCCACHE' o 'DBCC FREESYSTEMCACHE'".

Se recomienda el uso de estos comandos con discreción, ya que el uso continuo causara la degradación del rendimiento de las consultas, dado que cada vez que se libera el espacio de cache, se llevara a cabo la re-compilación de las consultas.

jueves, 9 de noviembre de 2017

SQL Server DBCC TRACEON / TRACEOFF

Comandos DBCC TRACEON / TRACEOFF y las marcas de seguimiento

Ya he indicado, cuando se inició con los Comandos DBCC, sobre los comandos varios o misceláneos, en esta ocasión hablare de dos comandos, el primero que habilita las marcas de seguimiento especificadas. Y el segundo que deshabilita las marcas de seguimiento especificados con el primer comando. Sin embargo es necesario mencionar que son las marcas de seguimiento y como pueden ayudarnos.

Se puede indicar que las marcas de seguimiento son utilizadas para establecer algunas características en el servidor de forma temporal, las que se habilitan o deshabilitan con los comandos que hemos indicado. Es importante mencionar que algunas marcas de seguimiento fueron introducidas para versiones específicas de Microsoft SQL Server, por lo que se hace necesario consultar el artículo asociado en Microsoft Support.
Actualmente se cuenta con 96 marcas de seguimiento, las cuales se clasifican en tres tipos de ámbito, global, sesión y consulta. Las 96 se utilizan en el ámbito global, esto es, se establecen en el nivel de servidor y se mantienen visibles para todas las conexiones en el servidor.  En el ámbito de sesión, se encuentran 45 de las 96 definidas, esto significa que las marcas de seguimiento se activarán únicamente para ser usadas en la conexión que las establece no están visibles para las demás conexiones, como es el caso de las globales. Cuando se habilita una marca de seguimiento en el ámbito de sesión, si se cierra la conexión, se desactiva la marca de seguimiento, dado que solo se habilito en esa conexión. Finalmente, las marcas de seguimiento de ámbito de consulta, son aquellas que solo se habilitan en el contexto de ejecución de la consulta, para ello se utiliza la opción QUERYTRACEON de la instrucción SELECT.

No indicaré cada una de las marcas de seguimiento que actualmente se manejan el Microsoft SQL Server, toda la información relacionada con las marcas de seguimiento se encuentra en los libros en linea de Microsoft SQL Server.
Es importante mencionar que deben tenerse en cuenta las siguientes reglas para su aplicación:
  •        Una marca de seguimiento de ámbito global debe habilitarse a nivel global, ya que en caso contrario no surtirá efecto. Es recomendable que se utilice la opción –T en la línea de comando de inicio de servicios de Microsoft SQL Server, lo cual garantizará que la marca permanezca activa después del reinició del servidor.
  •        Una marca de seguimiento que puede ser usada en cualquiera de los ámbitos mencionados, puede ser habilitada en el ámbito adecuado, teniendo en cuenta que una marca de seguimiento habilitada en el nivel de sesión nunca afectara otra sesión y el efecto se perderá cuando el SPID que inicio la marca de seguimiento sea cerrado.
Como puede deducirse, la habilitación de las marcas de seguimiento se habilitan o deshabilitan con los comandos DBCC TRACEON y DBCC TRACEOFF, que se analizan más adelante. Como se ha mencionado anteriormente, también es posible utilizar la opción –T en la línea de comando de inicio de servicios, recordando que esta opción habilita a nivel global, no será posible habilitar una marca de seguimiento a nivel sesión con la opción –T en el inició de los servicios. Para el nivel de consulta debe utilizarse la opción QUERYTRACEON en la instrucción SELECT. Es posible validar que marcas de seguimiento se encuentran activas utilizando el comando DBCC TRACESTATUS.
No es mi intención analizar la instrucción SELECT y sus opciones, solo mencionare un ejemplo del uso de la opción QUERYTRACEON, para que se observe como se lleva a cabo. Solo por mencionar un par de marcas de seguimiento que se encuentran en el grupo de las que pueden utilizarse a nivel de consulta, sugiero que se revise bien la documentación correspondiente a las marcas de seguimiento.

Marca de Seguimiento
Descripción
4137
Permite que Microsoft SQL Server genere un plan usando mínima selectividad cuando estima predicados AND para filtrar teniendo en cuenta la correlación, en el modelo de estimación de cardinalidad del optimizador de consultas de Microsoft SQL Server 2012 y versiones anteriores.
4199
Habilita al optimizador de consultas (QO) los cambios publicados en Microsoft SQL Server actualizaciones acumulativas y Service Packs.

Teniendo esto en cuenta, podemos llevar a cabo la consulta utilizando estas marcas de seguimiento de la siguiente manera:
SELECT x
  FROM correlated
 WHERE f1 = 0 AND f2 = 1 OPTION (QUERYTRACEON 4199, QUERYTRACEON 4137)

En esta instrucción se lleva cabo la consulta a la tabla identificada como correlated con la opción el uso de las marcas de seguimiento identificadas como 4199 y 4137. Por lo que esta consulta puede habilitar todas las revisiones que afectan al plan controladas por marcas de seguimiento indicadas para la consulta.

DBCC TRACEON


Como se ha indicado este comando habilita las marcas de seguimiento que se especifican. Tratándose de un servidor de producción, es recomendable habilita las marcas se seguimiento en todo el servidor para evitar un comportamiento impredecible, las cuales pueden habilitarse, utilizando la opción –T en la línea de comandos de Microsoft SQL Server, o utilizando el comando DBCC TRACEON.
Si bien las marcas de seguimiento son utilizadas para personalizar algunas características que controlen el funcionamiento de Microsoft SQL Server, las marcas de seguimiento habilitadas permanecerán hasta que sean deshabilitadas.

La sintaxis que puede utilizarse para habilitar una marca a nivel global es:

DBCC TRACEON (trace_num, -1);
En este caso se observa que se habilitara la marca de seguimiento trace_num a nivel global, indicado con el argumento -1,
La sintaxis que puede utilizarse para habilitar una marca a nivel de sesión es:

DBCC TRACEON (trace_num);
Ahora se observa que se habilitara la marca de seguimiento trace_num a nivel de sesión, la ausencia del argumento -1, indica que es a nivel sesión. 

Existen un argumento opcional que pueden ser utilizado con el comando, éste es:

WITH NO_INFOMSGS
Suprime todos los mensajes informativos.

Es preciso indicar que pueden indicarse más de un número asociado con la marca de seguimiento en el comando de tal forma que solo necesita separarse por comas.

Ejemplos de DBCC TRACEON


Mostraré algunos ejemplos de uso de este comando:

DBCC TRACEON (3205);
En este ejemplo, se habilitara la marca de seguimiento identificada como 3205, que permite deshabilitar la compresión de hardware para los controladores de cinta, esta acción se lleva  cabo a nivel de sesión.

DBCC TRACEON (3205, -1);
En el ejemplo, se habilita la marca de seguimiento 3205, ahora a nivel global.

DBCC TRACEON (3205, 260, -1) WITH NO_INFOMSGS;
En este ejemplo, se habilitan las marcas 3205, para deshabilitar la compresión de hardware para controladores de cinta y la marca 260, que imprime información de versión sobre las bibliotecas de vínculos dinámicos (DLL) de procedimientos almacenados extendidos, de forma global.

DBCC TRACEOFF


Como se mencionó anteriormente, este comando deshabilita  las marcas de seguimiento que se indiquen, previamente habilitadas.
La sintaxis que puede utilizarse para deshabilitar una marca a nivel global es:

DBCC TRACEOFF (trace_num, -1);
En este caso se observa que se deshabilitará la marca de seguimiento trace_num a nivel global, indicado con el argumento -1,

La sintaxis que puede utilizarse para deshabilitar una marca a nivel de sesión es:

DBCC TRACEOFF (trace_num);
Aquí se observa que se deshabilitará la marca de seguimiento trace_num a nivel de sesión, la ausencia del argumento -1, indica que es a nivel sesión. La sintaxis e información completa de este comando se encuentran en los libros en línea de Microsoft SQL Server.

Existen un argumento opcional que pueden ser utilizado con el comando, éste es:

WITH NO_INFOMSGS
Suprime todos los mensajes informativos.

Como en el caso del comando DBCC TRACEON, pueden indicarse mas de un número asociado con la marca de seguimiento en el comando de tal forma que solo necesita separarse por comas.

Ejemplos de DBCC TRACEOFF

Mostraré algunos ejemplos de uso de este comando:

DBCC TRACEOFF (3205);
Se deshabilitará la marca de seguimiento identificada con el número 3205.

DBCC TRACEOFF (3205, -1) WITH NO_INFOMSGS;
En el ejemplo, se deshabilita la marca de seguimiento identificada con el número 3205, habilitada previamente a nivel global, sin emitir mensajes informativos.

Comentarios.


Las marcas de seguimiento son una de las herramientas que se tienen para el diagnóstico de problemas de rendimiento, la depuración de procedimientos almacenados o la determinación de problemas de sistemas complejos. Hay que revisar cada una de las características específicas de operación de las marcas de seguimiento para poder determinar cuál de ellas es la que puede ser utilizada con una versión especifica de Microsoft SQL Server y el propósito de diagnóstico requerido en su utilización.
Recuérdese que el uso del comando DBCC TRACEON para establecer una marca de seguimiento a nivel global solo permanecerá activa, mientras no se utilice el comando DBCC TRACEOFF para deshabilitarla o el servicio de Microsoft SQL Server no sea reiniciado, ya que una vez que se ha reiniciado la marca de seguimiento no se habilitara, si se desea que la marca de seguimiento se mantenga en operación debe utilizarse la opción –T en la línea de comando de inicio de servicios de Microsoft SQL Server.

Microsoft ha indicado que es posible que en futuras versiones de Microsoft SQL Server no se admita el comportamiento de algunas de las marcas de seguimiento, por lo que hay que validar el uso de alguna de las marcas de seguimiento actuales en versiones posteriores.