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.