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.