Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Substitua o otimizador de consulta para suas associações T-SQL com FORCEPLAN


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.