Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zastąp Optymalizator zapytań dla połączeń T-SQL za pomocą FORCEPLAN

SET FORCEPLAN Instrukcja zastępuje logikę używaną przez optymalizator zapytań SQL Server do przetwarzania T-SQL SELECT oświadczenie.

Dokładniej, gdy FORCEPLAN jest ustawiony na ON , optymalizator zapytań przetwarza sprzężenie w tej samej kolejności, w jakiej tabele pojawiają się w FROM klauzula zapytania.

Wymusza to również użycie sprzężenia w pętli zagnieżdżonej, chyba że inne typy sprzężenia są wymagane do skonstruowania planu zapytania lub są wymagane ze wskazówkami sprzężenia lub wskazówkami dotyczącymi zapytania.

Przykład

Aby zademonstrować, jak FORCEPLAN działa, zamierzam uruchomić dwa SELECT zapytania, najpierw z FORCEPLAN ustaw na ON , a następnie FORCEPLAN ustaw na OFF .

Oba zapytania są identyczne, z wyjątkiem tego, że tabele sprzężenia są wymienione w innej kolejności.

W tym przykładzie używam SHOWPLAN_XML aby wyświetlić szacowany plan zapytania, ale równie łatwo można użyć innej metody (takiej jak przycisk Wyjaśnij w Azure Data Studio lub Include Actual Execution Plan w SSMS, aby wyświetlić rzeczywisty plan zapytania).

USTAW FORCEPLAN WŁĄCZ

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;

Wynik:

Widzimy, że plan zapytania dla każdego zapytania odzwierciedla kolejność, w jakiej umieściłem nazwy tabel w FROM klauzula.

WYŁĄCZENIE FORCEPLANU

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;

Wynik:

Tym razem oba zapytania dają identyczny plan zapytań. Optymalizator zapytań zignorował kolejność, w jakiej wymieniłem je w FROM klauzuli i określił własną kolejność.

Zauważ, że FORCEPLAN ustawienie nie zmienia danych zwracanych przez SELECT oświadczenie. Rzeczywiste wyniki są takie same niezależnie od tego, czy FORCEPLAN jest ustawiony na ON lub OFF . Jedyną różnicą jest sposób przetwarzania tabel (co może mieć wpływ na wydajność).

Możesz użyć SET FORCEPLAN w połączeniu ze wskazówkami optymalizatora zapytań, aby dodatkowo wpłynąć na sposób przetwarzania zapytania.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak mogę zaktualizować 100 najlepszych rekordów na serwerze sql?

  2. Jak uzyskać kolejną wartość sekwencji SQL Server w Entity Framework?

  3. Funkcja IndexOf w T-SQL

  4. Co to jest impas w SQL Server?

  5. Jak wybrać dane tabeli z innej bazy danych w SQL Server?