SQL là một ngôn ngữ khai báo, không phải là một ngôn ngữ thủ tục. Đó là, bạn xây dựng một câu lệnh SQL để mô tả kết quả mà bạn muốn. Bạn không nói với công cụ SQL cách để thực hiện công việc.
Theo nguyên tắc chung, bạn nên để công cụ SQL và trình tối ưu hóa SQL tìm ra phương án truy vấn tốt nhất. Có rất nhiều năm nỗ lực dành cho việc phát triển 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ấu trúc lại truy vấn, cập nhật thống kê, sử dụng bảng tạm thời, thêm chỉ mục, v.v. để có được hiệu suất tốt hơn.
Đối với câu hỏi của bạn. Về lý thuyết, hiệu suất của CTE và truy vấn con phải giống nhau vì cả hai đều cung cấp thông tin giống nhau 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. 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 phổ biến).
Bảng tạm thời là một vấn đề khác, vì bạn đang cung cấp thêm hướng dẫn về cách chạy truy vấn. Một điểm khác biệt chính là trình tối ưu hóa có thể sử dụng 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 thi 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 thử để đạt được hiệu suất như mong đợi, đặc biệt là đố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 thi hoàn hảo. Mặc dù điều này thường xảy ra nhưng bạn có thể tìm ra cách để đạt được hiệu suất tốt hơn.