SQL là ngôn ngữ khai báo, không phải là ngôn ngữ thủ tục. Đó là, bạn xây dựng một câu lệnh SQL để mô tả các kết quả mà bạn muốn. Bạn không nói cho công cụ SQL biết cách thực hiện công việc.
Theo nguyên tắc chung, nên để công cụ SQL và trình tối ưu hóa SQL tìm ra kế hoạch truy vấn tốt nhất. Có nhiều nỗ lực trong nhiều năm để phát triển một công cụ SQL, vì vậy hãy để các kỹ sư làm những gì họ biết cách làm.
Tất nhiên, có những tình huống mà kế hoạch truy vấn không tối ưu. Sau đó, bạn muốn sử dụng gợi ý truy vấn, cơ cấu lại truy vấn, cập nhật số liệu thống kê, sử dụng bảng tạm thời, thêm chỉ mục, v.v để có hiệu suất tốt hơn.
Đối với câu hỏi của bạn. Về mặt lý thuyết, hiệu năng của CTE và các truy vấn con phải giống nhau vì cả hai đều cung cấp cùng một thông tin cho trình tối ưu hóa truy vấn. Một điểm khác biệt là CTE được sử dụng nhiều lần có thể dễ dàng xác định và tính toán một lần. Các kết quả sau đó có thể được lưu trữ và đọc nhiều lần. Thật không may, SQL Server dường như không tận dụng được phương pháp tối ưu hóa cơ bản này (bạn có thể gọi đây là loại bỏ truy vấn con chung).
Các bảng tạm thời là một vấn đề khác, bởi vì bạn đang cung cấp thêm hướng dẫn về cách chạy truy vấn. Một sự khác biệt chính là trình tối ưu hóa có thể sử dụng số liệu thống kê từ bảng tạm thời để thiết lập kế hoạch truy vấn của nó. Điều này có thể dẫn đến tăng hiệu suất. Ngoài ra, nếu bạn có một CTE (truy vấn con) phức tạp được sử dụng nhiều lần, thì việc lưu trữ nó trong một bảng tạm thời thường sẽ giúp tăng hiệu suất. Truy vấn chỉ được thực hiện một lần.
Câu trả lời cho câu hỏi của bạn là bạn cần phải chơi xung quanh để có được hiệu suất mà bạn mong đợi, đặc biệt đối với các truy vấn phức tạp được chạy thường xuyên. Trong một thế giới lý tưởng, trình tối ưu hóa truy vấn sẽ tìm thấy đường dẫn thực hiện hoàn hảo. Mặc dù nó thường như vậy, bạn có thể tìm ra cách để có hiệu suất tốt hơn.