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.