Introducción
El almacén de consultas es una característica nueva, introducida en SQL Server 2016, que permite a los administradores de bases de datos revisar históricamente las consultas y sus planes asociados mediante la GUI disponible en SQL Server Management Studio, así como analizar el rendimiento de las consultas mediante determinadas vistas de administración dinámica. Query Store es una opción de configuración de ámbito de base de datos y está disponible para su uso si el nivel de compatibilidad de la base de datos en cuestión es 130.
Query Store es similar a tecnologías de la plataforma de base de datos de Oracle como Automatic Workload Repository (AWR). El AWR captura estadísticas de rendimiento a una escala aún mayor que Query Store y permite que un administrador de base de datos analice históricamente el rendimiento. Conceptos tales como un período de retención y los límites de almacenamiento de los datos recopilados están disponibles en la arquitectura AWR como lo están en Query Store. Las siguientes opciones de configuración clave están disponibles cuando se activa el Almacén de consultas:
- Modo de funcionamiento: Determina si Query Store aceptará datos recién capturados (modo de lectura y escritura) o simplemente almacenará datos antiguos disponibles para informes (modo de solo lectura)
- Intervalo de vaciado de datos: Determina la frecuencia con la que los búferes de memoria del Almacén de consultas se vacían en un disco. Recuerde que los datos del Almacén de consultas se almacenan en la base de datos donde el Almacén de consultas está habilitado. El valor predeterminado es 15 minutos.
- Intervalo de recopilación de estadísticas: Determina la frecuencia con la que se recopilan las estadísticas de tiempo de ejecución del almacén de consultas.
- Tamaño máximo: Determina cuánto puede crecer el repositorio de estadísticas del Almacén de consultas. Por defecto, es de 100 MB.
- Modo de captura del almacén de consultas: Determina la granularidad de las capturas de consultas. TODO, AUTOMÁTICO y NINGUNO son las opciones disponibles. El valor predeterminado es AUTO.
- Modo de limpieza basado en el tamaño: Determina si Query Store eliminará los datos antiguos cuando se alcance el tamaño máximo.
- Umbral de consulta obsoleta: Determina el número de días durante los cuales Query Store conserva los datos. El valor predeterminado se establece en treinta días.
Fig. 2 Opciones del almacén de consultas
El almacén de consultas es una característica del ámbito de la base de datos que se puede habilitar mediante la GUI (SQL Server Management Studio) o ejecutando el siguiente comando:
ALTERAR BASE DE DATOS [WideWorldImporters] SET QUERY_STORE =ON;
La telemetría de consulta recopilada por el Almacén de consultas se almacena en las tablas del sistema dentro de la base de datos donde se ha habilitado el Almacén de consultas.
Consultas de muestra e informes predeterminados
Hasta ahora todo lo que he escrito está disponible en muchas otras fuentes; algunos de ellos se pueden encontrar en la sección de referencias.
En esta sección, profundizaremos un poco más en lo que realmente podemos hacer con Query Store una vez que lo hayamos habilitado usando ejemplos simples. Consideremos las siguientes dos consultas:
Listado 1:Obtener registros usando un filtro específico
use WideWorldImportersgoselecta.ContactPersonID,a.OrderDate,a.DeliveryMethodID,a.Comments,b.OrderedOutersfromPurchasing.PurchaseOrders ainner join Purchasing.PurchaseOrderLines bon a.PurchaseOrderID=b.PurchaseOrderIDwhere a.SupplierReference='ML0300202';go 1000
Listado 2:Obtener registros usando un rango
use WideWorldImportersgoselecta.ContactPersonID,a.OrderDate,a.DeliveryMethodID,a.Comments,b.OrderedOutersfromPurchasing.PurchaseOrders ainner join Purchasing.PurchaseOrderLines bon a.PurchaseOrderID=b.PurchaseOrderIDwhere a.SupplierReference like 'ML%';go 1500
Preste atención a la versión alternativa de estas consultas escritas en mayúsculas:
Listado 1:Obtener registros usando un filtro específico (mayúsculas)
USE IMPORTADORES DE TODO EL MUNDO GO SELECCIONE UN ID DE PERSONA DE CONTACTO, UNA FECHA DE PEDIDO, UN ID DE MÉTODO DE ENTREGA, A. COMENTARIOS, B. EXTERNOS ORDENADOS DESDE COMPRAS.ÓRDENES DE COMPRA Y UNIRSE A COMPRAS.ORDEN DE COMPRA BON A.ORDEN DE COMPRA ID=B.ORDEN DE COMPRA ID DONDE A.PROVEEDOR REFERENCIA='ML0300 502'; pre>Listado 2:Obtener registros usando un rango (mayúsculas)
USE IMPORTADORES DE TODO EL MUNDO GO SELECCIONE UN ID DE PERSONA DE CONTACTO, UNA FECHA DE PEDIDO, UN ID DE MÉTODO DE ENTREGA, A. COMENTARIOS, B. EXTERNOS ORDENADOS DESDE COMPRAS.ÓRDENES DE COMPRA Y UNIRSE A COMPRAS.ORDENES DE COMPRA BON A.ORDEN DE COMPRA ID=B.ORDEN DE COMPRA DONDE UNA.REFERENCIA DE PROVEEDOR COMO 'ML%';GO 250 /pre>Como puede ver, ejecutamos estas consultas varias veces con la palabra clave GO. Por lo tanto, tenemos una cantidad razonable de datos con los que trabajar. Lo primero que debemos tener en cuenta al usar el Almacén de consultas para analizar el rendimiento es que hay seis informes predeterminados integrados en el Almacén de consultas de SQL Server 2016, como se muestra en la figura 3.
Fig. 3 Informes del almacén de consultas
Los nombres de los informes se describen detalladamente en los artículos anteriores, así como en la documentación de Microsoft. Los datos proporcionados por estos informes se recuperan de las vistas de gestión dinámica clave que se enumeran a continuación:
Estadísticas del plan DMV
- sys.query_store_query_text – contiene textos de consulta únicos ejecutados contra la base de datos
- sys.query_store_plan – contiene un plan estimado para la consulta con las estadísticas de tiempo de compilación
- sys.query_context_settings – contiene algunas combinaciones únicas del plan que afectan la configuración bajo la cual se ejecutan las consultas
- sys.query_store_query – entradas de consulta que son rastreadas y forzadas por separado en Query Store
DMV de estadísticas de tiempo de ejecución
- sys.query_store_runtime_stats_interval – Query Store divide el tiempo en ventanas de tiempo generadas automáticamente (intervalos) y almacena estadísticas agregadas en ese intervalo para cada plan ejecutado
- sys.query_store_runtime_stats – contiene estadísticas de tiempo de ejecución agregadas para planes ejecutados
Hay muchos más detalles disponibles sobre cómo usar estos DMV en la documentación de Microsoft a la que se hace referencia. En este artículo, simplemente usaremos la GUI principalmente.
Como puede ver en la Fig. 4, revisamos el informe de consumo general de recursos, mientras que en la siguiente sección nos limitaremos a las consultas que enumeramos anteriormente y los datos que podemos recuperar de estas consultas simples.
Fig. 4 Informe general de consumo de recursos
Análisis de consultas mediante la GUI
Algunas cosas clave deben considerarse útiles al usar los informes del almacén de consultas:
- Puede configurar el entorno haciendo clic en el botón resaltado en la Fig. 4. La Fig. 5 nos muestra los detalles que podemos cambiar para adaptarnos a nuestro caso de uso:criterios de datos que se devolverán, intervalo de fechas y conjunto de datos que se devolverán. Por ejemplo, si quiero ver claramente el ID de consulta asociado con las consultas que estoy revisando, me gustaría reducir mi conjunto de datos de los 25 principales predeterminados a los 10 principales, por ejemplo.
Fig. 5 Opciones de configuración de informes
Fig. 6 Las 25 consultas principales ejecutadas el 1 de mayo de 2018
Fig. 7 Las 10 consultas principales ejecutadas el 1 de mayo de 2018
- Los gráficos de barras muestran datos principalmente con el tiempo en el eje X, pero puede profundizar en un punto de datos específico para ver los datos en función de los ID de consulta. Cada ID de consulta determina una consulta específica. Es importante tener en cuenta que una consulta se identifica de forma única al codificar el texto. Así, una consulta en minúsculas difiere de la misma consulta en mayúsculas. Esto debería ser un conocimiento común:las consultas ad-hoc son una preocupación para el caché del plan y también son malas para el almacén de consultas, tanto en términos de uso de espacio como de análisis adecuado.
Fig. 8 Consulta en el Listado 1 (En minúsculas, Consulta 42480)
Fig. 9 Consulta en el Listado 3 (Mayúsculas, Consulta 42490)
- La tercera observación importante es el hecho de que cuando un punto de datos se resalta en verde, el plan de ejecución detallado que se muestra en el panel inferior pertenece a ese punto de datos. En la Fig. 7, este punto de datos se refiere a la consulta ID 42481 que ejecutamos anteriormente (la consulta completa se muestra en el Listado 2). Al pasar el mouse sobre este punto de datos, se muestra la consulta, su ID y la cantidad de planes asociados con esta consulta (ver Fig. 8).
Fig. 10 Consulta 42481 Detalles
Nuestra consulta se ejecutó 1391 veces, ya que Query Store la capturó con precisión y se mostró en el eje y (recuento de ejecución) del gráfico de barras en la Fig. 10. El informe se extrajo mientras el lote aún se estaba ejecutando. Por lo tanto, no tenemos el conteo completo (1500) que nos informa que hay una captura de datos en tiempo real cada vez que se ejecuta una consulta. En el lado derecho, también vemos el Plan que se está utilizando para estas ejecuciones múltiples (Plano 675). Podemos verificar esto usando la consulta en el Listado 5.
Listado 5
USE WideWorldImportersGOSELECT Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*FROM sys.query_store_plan AS PlJOIN sys.query_store_query AS Qry ON Pl.query_id =Qry.query_idJOIN sys.query_store_query_text AS Txt ON Qry.query_text_id =Txt .query_text_iddonde Qry.query_id=42481;
Fig. 11 ID de consulta e ID del plan de los DMV
Un poco de ajuste
Echemos un vistazo a otra consulta.
Cuando ejecutamos la consulta en el Listado 6 y examinamos los detalles del Almacén de consultas, los detalles del plan de ejecución revelan que necesitamos un índice para obtener una mejora del 51 %.
Listado 6:Consulta subóptima
SELECT TOP (1000) [OrderLineID],[OrderID],[StockItemID],[Description],[PackageTypeID],[Quantity],[UnitPrice],[TaxRate],[PickedQuantity],[PickingCompletedWhen],[LastEditedBy ] ,[LastEditedWhen] FROM [WideWorldImporters].[Sales].[OrderLines] where precioUnidad> 1000 GO 2000
Fig. 12 Detalles de consulta subóptimos
Fig. 13 Plan de ejecución de consultas subóptimo
Una vez que creamos el índice recomendado utilizando la instrucción del Listado 7, hacemos que el Optimizador de consultas genere un nuevo plan de ejecución. En este caso, se espera que el nuevo plan de ejecución mejore el desempeño. Sin embargo, hay casos en los que ciertos cambios pueden causar un rendimiento degradado, como cambios significativos en el volumen de datos que invalidan las estadísticas o reducen la cantidad de índices, etc. Se dice que dichas consultas han retrocedido en el rendimiento y se pueden examinar mediante el informe de Consultas regresivas en el Almacén de consultas.
Listado 7:Creación de índices
USE [WideWorldImporters]GOCREATE NONCLUSTERED INDEX [Custom_IX_UnitPrice]ON [Sales].[OrderLines] ([UnitPrice])INCLUDE([OrderLineID],[OrderID],[StockItemID],[Description],[PackageTypeID],[Quantity ],[Tasa de impuestos],[Cantidad seleccionada],[Recolección completada cuando],[Última edición por],[Última edición cuando]) IR
Fig. 14 Consulta Optimizada (Cambio en el Plan de Ejecución)
Fig. 15 Consulta Optimizada (Dos Planes)
Fig. 16 Consulta optimizada (Force Plan)
Cuando hay varios planes para una consulta, como se muestra en la Fig. 14 y la Fig. 16, podemos decirle al optimizador que siempre use un plan que elijamos haciendo clic en el botón Forzar plan. Esta era una tarea un poco tediosa en las versiones anteriores de SQL Server.
Como puede ver en la Fig. 17, Query Store nos permite comparar los diferentes planes asociados con una consulta utilizando una serie de métricas.
Fig. 17 Comparación de planes de ejecución
Nuevamente, podemos usar la consulta en el Listado 8 para verificar los planes asociados con esta ID de consulta usando los DMV. (Consulte la Fig. 11)
Listado 8:Planes asociados con la consulta 42497
USE WideWorldImportersGOSELECT Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*FROM sys.query_store_plan AS PlJOIN sys.query_store_query AS Qry ON Pl.query_id =Qry.query_idJOIN sys.query_store_query_text AS Txt ON Qry.query_text_id =Txt .query_text_iddonde Qry.query_id=42497;
Explorando variaciones
Otro informe útil del que nos sirve Query Store es el de Consultas con alta variación. Este informe nos muestra qué tan lejos están las métricas deseadas para una consulta específica durante un período determinado. Esto es muy útil para el análisis histórico del rendimiento. Usando las declaraciones en el Listado 9, generamos datos que pueden dar una imagen de cómo se verían las variaciones. Los pasos del procedimiento simplemente crean una pequeña tabla y luego insertan registros utilizando diferentes tamaños de lote.
Listado 9:Planes asociados con la consulta 42497
use WideWorldImportersgo-- Cree una tabla Tablecreate table tableone(ID int Identity(1000,1),FirstName varchar(30),LastName varchar(30),CountryCode char(2),HireDate datetime2 default getdate());-- Insertar registros en lotes de diferentes tamañosinsertar en valores de tableone ('Kenneth','Igiri','NG',getdate());IR 10000insertar en valores de tableone ('Kwame','Boateng','GH', getdate());GO 10insertar en los valores de tableone ('Philip','Onu','NG',getdate());GO 100000insertar en los valores de tableone ('Kwesi','Armah','GH', getdate());GO 100
Query Store nos muestra detalles como los valores mínimo y máximo de estas métricas para intervalos de ejecución específicos de la consulta que nos interesa. En este ejemplo, encontramos que esto es simplemente el resultado de la cantidad de lotes por ejecución (tenga en cuenta que el los parámetros se están utilizando realmente para ejecutar la instrucción INSERT). En la producción, otros factores podrían ser responsables de tales variaciones.
Fig. 18 Variaciones en la Duración
Fig. 19 Variación en escrituras lógicas
Fig. 20 Variación en lecturas físicas
Conclusión
En este artículo, hemos revisado el entorno de GUI del Almacén de consultas de SQL Server 2016 y algunas cosas que podemos deducir con respecto al rendimiento de nuestra instancia (con respecto a SQL) usando el Almacén de consultas. Hay varios artículos en Internet que muestran casos de uso aún más avanzados y una explicación mucho más profunda de las partes internas. Este artículo debería ser de gran utilidad para los administradores de bases de datos de nivel medio que deseen obtener una ventaja inicial en el uso de Query Store para la evaluación o el ajuste del rendimiento.
Referencias
- Prácticas recomendadas con el almacén de consultas
- Cristiman, L. (2016) Almacén de consultas:configuración y límites
- Supervisión del rendimiento mediante el almacenamiento de consultas
- Consultar vistas del catálogo de la tienda
- Procedimientos almacenados del almacén de consultas
- Almacén de consultas:cómo funciona y cómo usarlo
- Escenarios de uso del almacén de consultas
- Van de Lar, E. (2016) Almacén de consultas de SQL Server 2016:forzar planes de ejecución mediante el almacén de consultas
Herramienta útil:
dbForge Query Builder para SQL Server:permite a los usuarios crear consultas SQL complejas rápida y fácilmente a través de una interfaz visual intuitiva sin necesidad de escribir código manualmente.