SET FORCEPLAN
câu lệnh ghi đè logic được sử dụng bởi trình tối ưu hóa truy vấn SQL Server để xử lý một T-SQL SELECT
tuyên bố.
Cụ thể hơn, khi FORCEPLAN
được đặt thành ON
, trình tối ưu hóa truy vấn xử lý một phép nối theo thứ tự như các bảng xuất hiện trong FROM
mệnh đề của một truy vấn.
Điều này cũng buộc việc sử dụng một phép nối vòng lặp lồng nhau trừ khi các kiểu phép nối khác được yêu cầu để xây dựng một kế hoạch cho truy vấn hoặc chúng được yêu cầu với các gợi ý kết hợp hoặc gợi ý truy vấn.
Ví dụ
Để chứng minh cách FORCEPLAN
hoạt động, tôi sẽ chạy hai SELECT
truy vấn, trước tiên với FORCEPLAN
đặt thành ON
, sau đó với FORCEPLAN
đặt thành OFF
.
Cả hai truy vấn đều giống hệt nhau, ngoại trừ các bảng nối được liệt kê theo thứ tự khác.
Trong ví dụ này, tôi sử dụng SHOWPLAN_XML
để hiển thị kế hoạch truy vấn ước tính, nhưng bạn có thể dễ dàng sử dụng một phương pháp khác (chẳng hạn như nút Giải thích trong Azure Data Studio hoặc Include Actual Execution Plan
trong SSMS để hiển thị kế hoạch truy vấn thực tế).
BẬT LỰC LƯỢNG
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;
Kết quả:
Chúng ta có thể thấy rằng kế hoạch truy vấn cho mỗi truy vấn phản ánh thứ tự mà tôi đã đưa các tên bảng vào FROM
mệnh đề.
TẮT 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;
Kết quả:
Lần này, cả hai truy vấn đều dẫn đến một kế hoạch truy vấn giống hệt nhau. Trình tối ưu hóa truy vấn đã bỏ qua thứ tự mà tôi đã liệt kê chúng trong FROM
và xác định thứ tự của riêng nó.
Lưu ý rằng FORCEPLAN
cài đặt không thay đổi dữ liệu được trả về bởi SELECT
tuyên bố. Các kết quả thực tế đều giống nhau bất kể FORCEPLAN
được đặt thành ON
hoặc OFF
. Sự khác biệt duy nhất là cách xử lý các bảng (có thể ảnh hưởng đến hiệu suất).
Bạn có thể sử dụng SET FORCEPLAN
kết hợp với các gợi ý của trình tối ưu hóa truy vấn để ảnh hưởng thêm đến cách xử lý truy vấn.