Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Ganti Pengoptimal Kueri untuk Gabungan T-SQL Anda dengan FORCEPLAN

SET FORCEPLAN pernyataan mengesampingkan logika yang digunakan oleh pengoptimal kueri SQL Server untuk memproses SELECT . T-SQL pernyataan.

Lebih khusus lagi, ketika FORCEPLAN disetel ke ON , pengoptimal kueri memproses gabungan dalam urutan yang sama seperti tabel yang muncul di FROM klausa kueri.

Ini juga memaksa penggunaan gabungan loop bersarang kecuali jenis gabungan lain diperlukan untuk menyusun rencana kueri, atau mereka diminta dengan petunjuk gabungan atau petunjuk kueri.

Contoh

Untuk mendemonstrasikan bagaimana FORCEPLAN berfungsi, saya akan menjalankan dua SELECT kueri, pertama dengan FORCEPLAN setel ke ON , lalu dengan FORCEPLAN setel ke OFF .

Kedua kueri identik, dengan pengecualian bahwa tabel gabungan tercantum dalam urutan yang berbeda.

Dalam contoh ini saya menggunakan SHOWPLAN_XML untuk menampilkan perkiraan rencana kueri, tetapi Anda dapat dengan mudah menggunakan metode lain (seperti tombol Jelaskan di Azure Data Studio, atau Include Actual Execution Plan ikon di SSMS untuk menampilkan rencana kueri yang sebenarnya).

ATUR FORCEPLAN AKTIF

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;

Hasil:

Kita dapat melihat bahwa rencana kueri untuk setiap kueri mencerminkan urutan di mana saya menyertakan nama tabel di FROM klausa.

MENONAKTIFKAN FORCEPLAN

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;

Hasil:

Kali ini, kedua kueri menghasilkan rencana kueri yang identik. Pengoptimal kueri mengabaikan urutan yang saya cantumkan di FROM klausa dan menentukan urutannya sendiri.

Perhatikan bahwa FORCEPLAN pengaturan tidak mengubah data yang dikembalikan oleh SELECT penyataan. Hasil sebenarnya adalah sama terlepas dari apakah FORCEPLAN disetel ke ON atau OFF . Satu-satunya perbedaan adalah cara tabel diproses (yang dapat berdampak pada kinerja).

Anda dapat menggunakan SET FORCEPLAN bersama dengan petunjuk pengoptimal kueri untuk lebih memengaruhi cara kueri diproses.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DATEFROMPARTS() Contoh di SQL Server (T-SQL)

  2. Mengubah string yang Dipisahkan Koma menjadi baris individual

  3. Cari Tahu apakah Batasan CHECK adalah Level Kolom atau Level Tabel di SQL Server (Contoh T-SQL)

  4. Periksa Ruang yang Digunakan oleh Tabel di SQL Server

  5. Klausa WHERE vs ON saat menggunakan GABUNG