Saltar al contenido
Categoría: SQL Server
2024-05-08

Cómo buscar queries sin parametrizar en Query Store

Cómo buscar queries sin parametrizar en Query Store

Bienvenidos/as a un nuevo artículo en el blog de Aleson ITC. En el artículo de hoy te enseñaremos a buscar queries sin parametrizar en Query Store.

Hace poco tiempo tuvimos un problema en un servidor productivo de uno de nuestros clientes. Este problema estaba relacionado con Query Store y procesos Ad-Hoc. Es muy importante conocer que POR DEFECTO QUERY STORE NO FILTRA LOS PROCESOS ADHOC aunque tengamos la opción Optimize for Ad-Hoc workloads, a no ser que tengamos el modo de captura en Auto o en Custom.

¿Pero… cómo podemos saber si tenemos este tipo de cargas en nuestro entorno?

La verdad es que es bastante sencillo. Pero previamente debemos tener la configuración de captura en “all” en nuestro Query Store. Y de este modo estaremos capturando todas las consultas independientemente de la cantidad de ejecuciones, tiempo de uso de CPU, etc.

QUERY_CAPTURE_MODE = ALL

Para ver si las cargas de nuestro entorno son Ad-hoc utilizaremos los paneles de Query Store. En concreto el de TOP consultas con más ejecuciones.  Para ello vamos a la base de datos que queremos analizar, desplegamos la opción de Query Store y abrimos las TOP Resource Consuming Queries.

Vista Top Resources Consuming Queries de Query Store

En la gráfica seleccionamos Execution Count y de este modo se ordenará por el número de ejecuciones.

Vista Top Resources Consuming Queries de Query Store

En nuestro caso se ve una diferencia entre ejecuciones bastante notoria:

Vista Top Resources Consuming Queries

Después de configurar el modo de captura en ALL, Query Store empezará a almacenar todo tipo de consultas. En la imagen se ven consultas con muchas ejecuciones y otras con muy pocas o incluso 1 ejecución.

En caso de tener muchas consultas con 1 ejecución se debería valorar la opción PARAMETERIZATION FORCED para que SQL intente parametrizar las consultas y de este modo reutilizar los planes de ejecución.

¿Es siempre una buena práctica aplicar esta opción de Query Store?

La respuesta es NO. Esta opción debería ser revisada y aplicable en los casos en los que la mayoría de las consultas sean Ad-hoc pero los planes de ejecución sean similares. El motivo es que cuando habilitas esta opción SQL empezará a generar planes de ejecución “no tan buenos” y un mayor uso de la caché de planes. Además, se ha de tener en cuenta que cuando aplicamos esta opción se borrarán todos los planes de ejecución guardados en cache.

En que nos deberíamos basar para aplicar esta opción de Query Store

Lo primero en lo que deberíamos basarnos es si nuestra base de datos tiene mucho código Ad-hoc.

Con la siguiente consulta podremos realizar el análisis:

--If the number of different queries is much lower than the number of queries, it means that our queries are Ad-hoc.
SELECT COUNT(*) AS CountQueryRows FROM sys.query_store_query;  
SELECT COUNT(DISTINCT query_hash) AS CountDifferentQueryRows FROM  sys.query_store_query; 

--If the number of different plans is much lower than the number of plans, it means that our queries are Ad-hoc.
SELECT COUNT(*) AS CountPlanRows FROM sys.query_store_plan;  
SELECT COUNT(DISTINCT query_plan_hash) AS  CountDifferentPlanRows FROM  sys.query_store_plan;
Número de consultas
Número de consultas distintas
Número de planes de ejecución
Número de planes de ejecución distintos

En caso de ser bastante diferente tendremos dos opciones.

Aplicar PARAMETERIZATION FORCED para toda la base de datos, esto hará que SQL intente parametrizar de forma automática todas las consultas lanzadas sobre esta base de datos.

--Apply forced parameterization for entire database  
ALTER DATABASE <database name> SET PARAMETERIZATION FORCED;  

La otra opción es aplicar la opción sobre las consultas que hayamos detectado que son Ad-hoc y crear un plan guía para estas consultas. Pero este punto requiere mucha más explicación y daría para otra entrada de blog.

Una vez terminado podemos volver a cambiar la opción de captura de Query Store a como lo teníamos antes.

Conclusión

Podemos utilizar Query Store para detectar cargas de trabajo Ad-hoc y de este modo valorar si debemos aplicar la opción PARAMETERIZATION FORCED para toda la base de datos para reutilizar los planes de ejecución.

Gracias a esta herramienta podemos optimizar un servidor SQL Server en el que la carga de trabajo sea mayormente de consultas Ad-hoc.

Muchas gracias por la lectura, espero que te hayas podido resolver alguna duda y nos vemos en el siguiente blog!

¡No dejes que la gestión de datos de tu SQL Server ralentice tu progreso!

Complete este formulario para recibir la guía de Windows Server en Azure
*Obligatorio
Complete este formulario para recibir la guía de Windows Server en Azure
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete este formulario para recibir 4 best practices to implement a comprehensive Zero Trust security approach
*Obligatorio
Complete este formulario para recibir 4 best practices to implement a comprehensive Zero Trust security approach
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete este formulario para recibir Cloud Migration Essentials
*Obligatorio
Complete este formulario para recibir Cloud Migration Essentials
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete este formulario para recibir Cloud security Advice for Nonprofit Leaders
*Obligatorio
Complete este formulario para recibir Cloud security Advice for Nonprofit Leaders
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete este formulario para recibir Prevent data leaks with Microsoft 365 Business Premium
*Obligatorio
Complete este formulario para recibir Prevent data leaks with Microsoft 365 Business Premium
Gracias por rellenar el formulario [name]. ¡Aquí tienes tu eBook Gratis!
Complete this form to recieve the guide of Windows Server on Azure
*Required
Complete this form to recieve the guide of Windows Server on Azure
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve 4 best practices to implement a comprehensive Zero Trust security approach
*Required
Complete this form to recieve 4 best practices to implement a comprehensive Zero Trust security approach
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve Cloud Migration Essentials
*Required
Complete this form to recieve Cloud Migration Essentials
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve Cloud security Advice for Nonprofit Leaders
*Required
Complete este formulario para recibir Cloud security Advice for Nonprofit Leaders
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve Prevent data leaks with Microsoft 365 Business Premium
*Obligatorio
Complete this form to recieve Prevent data leaks with Microsoft 365 Business Premium
Thank you for filling out the form [name]. Here's your Free eBook!
Complete this form to recieve Cloud Migration Simplified Ebook.
*Obligatorio
Complete this form to recieve Prevent data leaks with Microsoft 365 Business Premium
Thank you for filling out the form [name]. Here's your Free eBook!