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

Kỹ thuật hiện thực hóa CTE T-SQL không hoạt động trên SQL Server 2012

Bạn có thể thử bằng cách sử dụng một hàm giá trị bảng nhiều bước. Bằng cách này, máy chủ buộc phải hiện thực hóa kết quả của TVF thành một biến bảng. Ngoài ra, bạn có thể thử sử dụng các ràng buộc khai báo khi khai báo loại bảng này (PRIMARY KEY, UNIQUE, CHECK) để cải thiện hiệu suất của truy vấn cuối cùng:

CREATE FUNCTION CocoJamboSchema.CocoJamboFunction(@parameters ...)
RETURNS @Results TABLE (
    Col1 INT NOT NULL,
    Col2 VARCHAR(10) NULL,
    ...
    PRIMARY KEY(Col1)
)
AS
BEGIN
    WITH MyCTE (...)
    AS
    (
        ...
    )
    INSERT @Results (...)
        FROM MyCTE;

    RETURN;
END;

SELECT ...
FROM CocoJamboSchema.CocoJamboFunction(param values) f
INNER JOIN MySchema.MyTable t ON f.Col1=t.Col1
ORDER BY t.Col1;

Đừng quên thêm ORDER BY mệnh đề cho truy vấn cuối cùng của bạn.

Gần đây, tôi đã sử dụng giải pháp này để tối ưu hóa một chế độ xem (ViewA, DISTINCT + LEFT JOIN + GETDATE ()) được sử dụng bởi một chế độ xem khác (ViewB). Trong trường hợp này (ViewA) không thể tạo chế độ xem được lập chỉ mục (vì DISTINCT + LEFT JOIN + GETDATE ()). Thay vào đó, tôi đã tạo một TVF nhiều câu lệnh để cải thiện hiệu suất bằng cách giảm số lần đọc logic (trong một số trường hợp) của truy vấn cuối cùng.

Lưu ý:Tất nhiên, bạn có thể thử sử dụng chế độ xem chỉ mục .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiểm tra xem một hàng có tồn tại hay không, nếu không, hãy chèn

  2. Hủy chia với tên cột

  3. Tổng quan về câu lệnh PRINT trong SQL Server

  4. Mệnh đề WHERE IS NULL, IS NOT NULL hoặc NO WHERE tùy thuộc vào giá trị tham số SQL Server

  5. Làm cách nào để xuất dữ liệu ở định dạng CSV từ SQL Server bằng sqlcmd?