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

Câu lệnh WITH thực thi một lần cho mỗi truy vấn hay một lần cho mỗi hàng?

Ví dụ:

SET NOCOUNT ON;
SET IMPLICIT_TRANSACTIONS ON;

CREATE TABLE MyTable (MyID INT  PRIMARY KEY);
GO
INSERT  MyTable (MyID)
VALUES  (11), (22), (33), (44), (55);

PRINT 'Test MyCTE:';
WITH MyCTE
AS (
    SELECT  *, ROW_NUMBER()OVER(ORDER BY MyID) AS RowNum
    FROM    MyTable
)
SELECT  *
FROM    MyCTE crt
LEFT JOIN MyCTE prev ON crt.RowNum=prev.RowNum+1;

ROLLBACK;

Nếu bạn chạy tập lệnh trước đó trong SSMS (nhấn Ctrl+M -> Kế hoạch thực thi thực tế) thì bạn sẽ nhận được kế hoạch thực thi này cho truy vấn cuối cùng:

Trong trường hợp này, CTE được thực thi một lần cho crt bí danh và năm (!) lần cho prev bí danh, một lần cho mỗi hàng từ crt .

Vì vậy, câu trả lời cho câu hỏi này

both :một lần cho mỗi truy vấn (crt ) và một lần mỗi hàng (prev :một lần cho mỗi từ crt ).

Để tối ưu hóa truy vấn này, ngay từ đầu, 1) Bạn có thể cố gắng lưu trữ kết quả từ CTE (MyCTE hoặc Query ) thành một biến bảng hoặc một bảng tạm thời

2) Xác định khóa chính của bảng này như là (các) cột tham gia,

3) Viết lại truy vấn cuối cùng để sử dụng biến bảng này hoặc bảng tạm thời.

Tất nhiên, bạn có thể cố gắng viết lại truy vấn cuối cùng mà không có sự kết hợp tự này giữa CTE.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa một lượng lớn dữ liệu khỏi SQL Server 2008

  2. Kết nối XML mà không truyền kiểu thành chuỗi

  3. Nhận danh sách các bảng có hoặc không có Ràng buộc khóa chính trong tất cả Cơ sở dữ liệu từ Phiên bản SQL Server - Hướng dẫn SQL Server / TSQL Phần 61

  4. Làm cách nào để thoát khỏi dấu ngoặc vuông trong mệnh đề LIKE?

  5. SQL Server Standard Edition Tương lai khả dụng cao