O
SET FORCEPLAN A instrução substitui a lógica usada pelo otimizador de consulta do SQL Server para processar um T-SQL SELECT demonstração. Mais especificamente, quando
FORCEPLAN está definido como ON , o otimizador de consulta processa uma junção na mesma ordem em que as tabelas aparecem no FROM cláusula de uma consulta. Isso também força o uso de uma junção de loop aninhado, a menos que outros tipos de junções sejam necessários para construir um plano para a consulta ou sejam solicitados com dicas de junção ou dicas de consulta.
Exemplo
Para demonstrar como
FORCEPLAN funciona, vou executar dois SELECT consultas, primeiro com FORCEPLAN definido como ON , então com FORCEPLAN definido como OFF . Ambas as consultas são idênticas, com a exceção de que as tabelas de junção estão listadas em uma ordem diferente.
Neste exemplo eu uso
SHOWPLAN_XML para mostrar o plano de consulta estimado, mas você pode facilmente usar outro método (como o botão Explicar no Azure Data Studio ou o Include Actual Execution Plan ícone no SSMS para exibir o plano de consulta real). DEFINIR FORCEPLAN ON
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 o plano de consulta para cada consulta reflete a ordem em que incluí os nomes das tabelas no
FROM cláusula. DEFINIR FORCEPLAN OFF
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:
Desta vez, ambas as consultas resultam em um plano de consulta idêntico. O otimizador de consulta ignorou a ordem em que eu os listei no
FROM cláusula e determinou sua própria ordem. Observe que o
FORCEPLAN configuração não altera os dados retornados pelo SELECT demonstração. Os resultados reais são os mesmos, independentemente de FORCEPLAN está definido como ON ou OFF . A única diferença é a forma como as tabelas são processadas (o que pode afetar o desempenho). Você pode usar
SET FORCEPLAN em conjunto com dicas do otimizador de consulta para afetar ainda mais como a consulta é processada.