BIÊN TẬP:
Xin vui lòng xem ý kiến của Martin dưới đây:
CTE không được vật chất hóa như một bảng trong bộ nhớ. Nó chỉ là một cách để đóng gói một định nghĩa truy vấn. Trong trường hợp của OP, nó sẽ được nội tuyến và giống như chỉ làm SELECT Column1, Column2, Column3 FROM SomeTable
. Hầu hết thời gian họ không được vật chất hóa lên phía trước, đó là lý do tại sao điều này không trả về hàng nào WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
, cũng kiểm tra các kế hoạch thực hiện. Mặc dù đôi khi có thể hack kế hoạch để có được một ống chỉ. Có một mục kết nối yêu cầu một gợi ý cho việc này. - Martin Smith ngày 15 tháng 2 năm 12 lúc 17:08
Câu trả lời gốc
CTE
Đọc thêm về MSDN
CTE tạo bảng đang được sử dụng trong bộ nhớ, nhưng chỉ hợp lệ cho truy vấn cụ thể theo sau nó. Khi sử dụng đệ quy, đây có thể là một cấu trúc hiệu quả.
Bạn cũng có thể muốn xem xét sử dụng một biến bảng. Điều này được sử dụng như một bảng tạm thời được sử dụng và có thể được sử dụng nhiều lần mà không cần phải được vật liệu hóa lại cho mỗi lần tham gia. Ngoài ra, nếu bạn cần duy trì một vài bản ghi ngay bây giờ, hãy thêm một vài bản ghi sau lần chọn tiếp theo, thêm một vài bản ghi sau một op khác, sau đó trả lại chỉ một số bản ghi, đây có thể là một cấu trúc tiện dụng, vì nó không Không cần phải bỏ sau khi thực hiện. Chủ yếu chỉ là cú pháp đường. Tuy nhiên, nếu bạn giữ số lượng hàng thấp, nó sẽ không bao giờ thành hiện thực. Xem sự khác biệt giữa bảng tạm thời và biến bảng trong SQL Server là gì? để biết thêm chi tiết.
Bảng tạm thời
Đọc thêm về MSDN - Cuộn xuống khoảng 40%
Một bảng tạm thời theo nghĩa đen là một bảng được tạo trên đĩa, chỉ trong một cơ sở dữ liệu cụ thể mà mọi người đều biết có thể bị xóa. Trách nhiệm của một nhà phát triển tốt là phá hủy các bảng đó khi không còn cần thiết, nhưng một DBA cũng có thể xóa sạch chúng.
Bảng tạm thời có hai loại: Địa phương và toàn cầu. Về mặt MS Sql Server, bạn sử dụng một #tableName
chỉ định cho cục bộ và ##tableName
chỉ định cho toàn cục (lưu ý việc sử dụng một hoặc hai # làm đặc tính nhận dạng).
Lưu ý rằng với các bảng tạm thời, trái ngược với các biến của bảng hoặc CTE, bạn có thể áp dụng các chỉ mục và tương tự, vì đây là các bảng hợp pháp theo nghĩa thông thường của từ này.
Nói chung, tôi sẽ sử dụng các bảng tạm thời cho các truy vấn dài hơn hoặc lớn hơn và các CTE hoặc biến bảng nếu tôi đã có một bộ dữ liệu nhỏ và muốn nhanh chóng tạo ra một đoạn mã cho một số mã nhỏ. Kinh nghiệm và lời khuyên của người khác chỉ ra rằng bạn nên sử dụng CTE nơi bạn có một số lượng nhỏ hàng được trả về từ đó. Nếu bạn có số lượng lớn, có lẽ bạn sẽ được hưởng lợi từ khả năng lập chỉ mục trên bảng tạm thời.