Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Ghi đè Trình tối ưu hóa truy vấn cho T-SQL của bạn tham gia với FORCEPLAN

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để sao chép cơ sở dữ liệu SQL Azure vào máy chủ phát triển cục bộ của tôi?

  2. Khôi phục sao lưu cơ sở dữ liệu SQL Server trên phiên bản thấp hơn

  3. Tách các giá trị được phân tách bằng dấu phẩy trong các cột thành nhiều hàng trong Sql Server

  4. Sự khác biệt giữa các hàm được định giá trong bảng của nhiều câu lệnh &các hàm được định giá trong bảng trong dòng trong SQL Server

  5. Lỗi SQL Server 206:Xung đột kiểu toán hạng