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.