sql >> Base de Datos >  >> RDS >> Sqlserver

Anule el optimizador de consultas para sus uniones T-SQL con FORCEPLAN

El SET FORCEPLAN anula la lógica utilizada por el optimizador de consultas de SQL Server para procesar un T-SQL SELECT declaración.

Más específicamente, cuando FORCEPLAN está configurado en ON , el optimizador de consultas procesa una combinación en el mismo orden en que aparecen las tablas en FROM cláusula de una consulta.

Esto también fuerza el uso de una combinación de bucle anidado a menos que se requieran otros tipos de combinaciones para construir un plan para la consulta, o se soliciten con sugerencias de combinación o sugerencias de consulta.

Ejemplo

Para demostrar cómo FORCEPLAN funciona, voy a ejecutar dos SELECT consultas, primero con FORCEPLAN establecer en ON , luego con FORCEPLAN establecer en OFF .

Ambas consultas son idénticas, con la excepción de que las tablas de combinación se enumeran en un orden diferente.

En este ejemplo uso SHOWPLAN_XML para mostrar el plan de consulta estimado, pero podría usar fácilmente otro método (como el botón Explicar en Azure Data Studio o Include Actual Execution Plan icono en SSMS para mostrar el plan de consulta real).

ACTIVAR FORCEPLAN

SET FORCEPLAN ON;
GO

SET SHOWPLAN_XML ON;
GO

SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Artists ar 
    INNER JOIN Albums al 
    ON ar.ArtistId = al.ArtistId 
    INNER JOIN Genres g 
    ON al.GenreId = g.GenreId;

SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Albums al
    INNER JOIN Genres g 
    ON al.GenreId = g.GenreId
    INNER JOIN Artists ar 
    ON ar.ArtistId = al.ArtistId;

Resultado:

Podemos ver que el plan de consulta para cada consulta refleja el orden en que incluí los nombres de las tablas en FROM cláusula.

DESACTIVAR FORCEPLAN

SET SHOWPLAN_XML OFF;
GO

SET FORCEPLAN OFF;
GO

SET SHOWPLAN_XML ON;
GO

SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Artists ar 
    INNER JOIN Albums al 
    ON ar.ArtistId = al.ArtistId 
    INNER JOIN Genres g 
    ON al.GenreId = g.GenreId;

SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Albums al
    INNER JOIN Genres g 
    ON al.GenreId = g.GenreId
    INNER JOIN Artists ar 
    ON ar.ArtistId = al.ArtistId;

Resultado:

Esta vez, ambas consultas dan como resultado un plan de consulta idéntico. El optimizador de consultas ignoró el orden en que las enumeré en FROM cláusula y determinó su propio orden.

Tenga en cuenta que el FORCEPLAN la configuración no cambia los datos devueltos por SELECT declaración. Los resultados reales son los mismos independientemente de si FORCEPLAN está configurado en ON o OFF . La única diferencia es la forma en que se procesan las tablas (lo que podría afectar el rendimiento).

Puedes usar SET FORCEPLAN junto con sugerencias del optimizador de consultas para afectar aún más cómo se procesa la consulta.