sql >> Database >  >> RDS >> Sqlserver

Overschrijf de Query Optimizer voor uw T-SQL-joins met FORCEPLAN

Het SET FORCEPLAN instructie overschrijft de logica die wordt gebruikt door de SQL Server-queryoptimalisatie om een ​​T-SQL SELECT te verwerken verklaring.

Meer specifiek, wanneer FORCEPLAN is ingesteld op ON , verwerkt de query-optimizer een join in dezelfde volgorde als de tabellen verschijnen in de FROM clausule van een zoekopdracht.

Dit dwingt ook het gebruik van een geneste loop-join af, tenzij andere typen joins nodig zijn om een ​​plan voor de query te maken, of ze worden aangevraagd met join-hints of query-hints.

Voorbeeld

Om te demonstreren hoe FORCEPLAN werkt, ga ik twee SELECT . uitvoeren queries, eerst met FORCEPLAN ingesteld op ON , dan met FORCEPLAN ingesteld op OFF .

Beide zoekopdrachten zijn identiek, behalve dat de samenvoegtabellen in een andere volgorde worden weergegeven.

In dit voorbeeld gebruik ik SHOWPLAN_XML om het geschatte queryplan weer te geven, maar u kunt net zo goed een andere methode gebruiken (zoals de knop Explain in Azure Data Studio of het Include Actual Execution Plan pictogram in SSMS om het werkelijke queryplan weer te geven).

STEL KRACHTPLAN IN

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;

Resultaat:

We kunnen zien dat het queryplan voor elke query de volgorde weerspiegelt waarin ik de tabelnamen heb opgenomen in de FROM clausule.

STEL KRACHTPLAN UIT

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;

Resultaat:

Deze keer resulteren beide query's in een identiek queryplan. De query-optimizer negeerde de volgorde waarin ik ze vermeldde in de FROM clausule en bepaalde zijn eigen volgorde.

Merk op dat de FORCEPLAN instelling verandert niets aan de gegevens die worden geretourneerd door de SELECT uitspraak. De werkelijke resultaten zijn hetzelfde, ongeacht of FORCEPLAN is ingesteld op ON of OFF . Het enige verschil is de manier waarop tabellen worden verwerkt (wat van invloed kan zijn op de prestaties).

U kunt SET FORCEPLAN . gebruiken in combinatie met hints voor het optimaliseren van zoekopdrachten om de manier waarop de zoekopdracht wordt verwerkt verder te beïnvloeden.


  1. Toegang krijgen tot Oracle DB in VirtualBox vanuit Host (windows)

  2. Fix "ERROR 1136 (21S01):Kolomtelling komt niet overeen met waardetelling in rij 1" bij het invoegen van gegevens in MariaDB

  3. Ongeldige algemene gebruikers- of rolnaam

  4. 3 manieren om de verzamelingen beschikbaar te krijgen in MariaDB