sql >> Database teknologi >  >> RDS >> Sqlserver

Tilsidesæt Query Optimizer til dine T-SQL-joins med FORCEPLAN

SET FORCEPLAN sætning tilsidesætter den logik, der bruges af SQL Server-forespørgselsoptimeringsværktøjet til at behandle en T-SQL SELECT erklæring.

Mere specifikt, når FORCEPLAN er indstillet til ON , behandler forespørgselsoptimeringsværktøjet en joinforbindelse i samme rækkefølge, som tabellerne vises i FROM klausul i en forespørgsel.

Dette tvinger også brugen af ​​en indlejret loop join, medmindre andre typer joins er nødvendige for at konstruere en plan for forespørgslen, eller de anmodes med join-tip eller forespørgselstip.

Eksempel

For at demonstrere hvordan FORCEPLAN virker, vil jeg køre to SELECT forespørgsler, først med FORCEPLAN indstillet til ON , derefter med FORCEPLAN indstillet til OFF .

Begge forespørgsler er identiske, med den undtagelse at jointabellerne er i en anden rækkefølge.

I dette eksempel bruger jeg SHOWPLAN_XML for at vise den estimerede forespørgselsplan, men du kan lige så nemt bruge en anden metode (såsom knappen Forklar i Azure Data Studio eller Include Actual Execution Plan ikon i SSMS for at vise den faktiske forespørgselsplan).

SÆT FORCEPLAN TIL

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;

Resultat:

Vi kan se, at forespørgselsplanen for hver forespørgsel afspejler den rækkefølge, hvori jeg inkluderede tabelnavnene i FROM klausul.

SÆT FORCEPLAN FRA

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;

Resultat:

Denne gang resulterer begge forespørgsler i en identisk forespørgselsplan. Forespørgselsoptimeringsværktøjet ignorerede rækkefølgen, hvori jeg listede dem i FROM klausul og bestemte sin egen rækkefølge.

Bemærk, at FORCEPLAN indstillingen ændrer ikke de data, der returneres af SELECT udmelding. De faktiske resultater er de samme uanset om FORCEPLAN er er indstillet til ON eller OFF . Den eneste forskel er måden, hvorpå tabeller behandles (hvilket kan påvirke ydeevnen).

Du kan bruge SET FORCEPLAN sammen med tip til forespørgselsoptimering for yderligere at påvirke, hvordan forespørgslen behandles.


  1. Sådan håndteres fragmentering af auto_increment ID-kolonnen i MySQL

  2. Kombiner flere resultater i en underforespørgsel til en enkelt kommasepareret værdi

  3. SQL Server Cursor Types - Dynamic Cursor | SQL Server Tutorial / TSQL Tutorial

  4. eliminer duplikerede matrixværdier i postgres