Ir al contenido principal

Intelligent Query Processing in SQL Server 2019: Enhancing Performance Automatically

 In database management, performance optimization is a crucial aspect of maintaining efficiency, scalability, and responsiveness. Traditionally, database administrators (DBAs) had to manually tune queries, optimize indexes, and adjust execution plans to improve SQL Server performance. With the introduction of Intelligent Query Processing (IQP) in SQL Server 2019, Microsoft has significantly enhanced the query execution process by integrating adaptive and automatic performance tuning mechanisms.

IQP is a set of automated performance enhancements that reduce the need for manual query optimization, ensuring that workloads run more efficiently with minimal changes to application code. This feature helps in solving common query performance issues like poor cardinality estimates, parameter sniffing, and excessive memory grants.

What is Intelligent Query Processing (IQP)?

Intelligent Query Processing (IQP) is a collection of automatic query performance enhancements designed to optimize execution plans dynamically. These improvements allow SQL Server to adapt better to different workloads, making queries run more efficiently with less manual intervention. IQP is part of Microsoft’s adaptive query processing efforts, which were first introduced in SQL Server 2017 and enhanced further in SQL Server 2019.

Key Features of Intelligent Query Processing

IQP consists of several query optimization techniques, including:

1. Batch Mode on Rowstore

  • Enables batch processing for rowstore tables, improving performance for analytic queries.

  • Before SQL Server 2019, batch mode processing was only available for columnstore indexes.

2. Approximate Query Processing

  • Introduces functions like APPROX_COUNT_DISTINCT to estimate distinct counts more efficiently.

  • Useful for large datasets where exact precision isn’t required, significantly improving performance.

3. Table Variable Deferred Compilation

  • Improves performance of queries using table variables by deferring compilation until execution.

  • Previously, table variables would always assume a fixed cardinality, leading to suboptimal execution plans.

4. Memory Grant Feedback (MGF)

  • Adjusts query memory allocation dynamically between executions to prevent excessive memory grants.

  • Helps avoid query spills to disk by adjusting memory allocations based on past performance.

5. Adaptive Joins

  • Allows the query optimizer to switch between Nested Loops and Hash Joins dynamically based on row estimates.

  • Reduces inefficiencies caused by poor cardinality estimations.

6. Interleaved Execution for Multi-Statement Table Valued Functions (MSTVFs)

  • Improves query execution by deferring optimization until actual row counts are known.

  • Prevents poor estimates from impacting query performance.

Benefits of Intelligent Query Processing

  • Automated Performance Optimization: Reduces manual tuning efforts by dynamically optimizing queries.

  • Better Resource Utilization: Adjusts memory and join strategies to minimize performance bottlenecks.

  • Scalability Improvements: Makes complex queries more efficient, especially in data-heavy workloads.

  • Minimal Code Changes: Works transparently with existing queries without requiring significant modifications.

Example: Using Intelligent Query Processing

Let's see how IQP improves performance through Memory Grant Feedback (MGF).

Step 1: Create a Sample Table

CREATE TABLE Sales (
    SaleID INT IDENTITY PRIMARY KEY,
    SaleAmount DECIMAL(10,2),
    SaleDate DATETIME DEFAULT GETDATE()
);

INSERT INTO Sales (SaleAmount)
SELECT TOP 1000000 RAND() * 1000 FROM master.dbo.spt_values;

This creates a sample Sales table with 1 million rows.

Step 2: Run a Query Without IQP

SET STATISTICS IO, TIME ON;
SELECT SUM(SaleAmount) FROM Sales;

Before Memory Grant Feedback, the initial query might request excessive memory, causing unused memory allocations.

Step 3: Enable Memory Grant Feedback and Run Again

ALTER DATABASE SCOPED CONFIGURATION SET MEMORY_GRANT_FEEDBACK = ON;

Running the query again, SQL Server dynamically adjusts memory grants based on previous execution statistics, optimizing memory usage.

Comentarios

Entradas populares de este blog

¿Qué es el nivel de aislamiento (Isolation Level) de una Transacción? ¿Qué niveles de aislamiento ofrece SQL Server?

Esta capítulo explica qué es el nivel de aislamiento (isolation level) de una transacción, el comportamiento de SQL Server en operaciones de lectura o de escritura, se detallan los diferentes niveles de aislamiento basados en bloqueos (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE) y los niveles de aislamiento basados en versionado de filas (READ COMMITTED SNAPSHOT, SNAPSHOT), se explican los males de la concurrencia (lecturas sucias, lecturas no repetibles, lecturas fantasma, y conflictos de actualización), como establecer el nivel de aislamiento deseado (SET TRANSACTION ISOLATION LEVEL y las opciones de base de datos READ_COMMITTED_SNAPSHOT y ALLOW_SNAPSHOT_ISOLATION), cómo conecer el tiempo máximo de bloqueo (@@LOCK_TIMEOUT) y como establecer el tiempo máximo de bloqueo (SET LOCK_TIMEOUT), etc. El nivel de aislamiento de una transacción (transaction isolation level)  define el grado en que se aísla una transacción de las modificaciones de recursos o datos...

Aumentar y Reducir la TempDB en SQL Server?

Una buena práctica después de instalar SQL Server (y que interesa revisar periódicamente) es tener bien dimensionada la base de datos TEMPDB, es decir que el  tamaño inicial de TEMPDB  sea suficiente, y en consecuencia no sea necesario que TEMPDB crezca ni tampoco reducir TEMPDB (SHRINK). Esta artículo explica brevemente  para qué sirve TEMPDB , explica camo cambiar el tamaño inicial de TEMPDB (aumentar o reducir),  cómo reducir TEMPDB , cuántos ficheros son recomendables para TEMPDB, etc. ¿Para qué sirve TEMPDB?  La base de datos TEMPDB es un elemento de gran importancia en una Instancia de SQL Server, ya que  TEMPDB es la encargada de almacenar tanto los objetos temporales  (tablas temporales, procedimientos almacenados temporales, etc.),  como los resultados intermedios  que pueda necesitar crear el motor de base de datos, por ejemplo durante la ejecución de consultas que utilizan las cláusulas GROUP BY, ORDER BY, DISTINCT, etc. (es d...

¿Qué es el Modo de Recuperación o Modo de Registro? Modos de Recuperación Simple, de Registro Masivo (BulkLogged), y Completo (Full). Operaciones de Registro Mínimo

El  Modo de Recuperación , también conocido como Modelo de Recuperación ó Modo de Registro, es una opción de configuración de base de datos que indica  cómo se gestiona el uso del LOG de Transacciones  de SQL Server para dicha base de datos (esta opción se configura para cada base de datos de forma independiente). En función de la configuración del Modo de Recuperación debemos  elegir la estrategia de Backup y Restauración de SQL Server  (o viceversa), y podremos mejorar el rendimiento de ciertas operaciones denominadas Operaciones de Registro Mínimo , minimizando las escrituras en el LOG de SQL Server (y en consecuencia, minimizando el tamaño del LOG de SQL Server). El Modo de Recuperación o Modo de Registro de SQL Server (Recovery Model) es quizás una de las configuraciones de base de datos más sensibles, y quizás una configuración relativamente desconocida: muchos conocen que existe la configuración de Modo de Recuperación en SQL Server, pero no se tiene...