Có một số khác biệt giữa Bảng tạm thời (#tmp) và Bảng biến (@tmp), mặc dù việc sử dụng tempdb không phải là một trong số chúng, như được nêu trong liên kết MSDN bên dưới.
Theo nguyên tắc chung, đối với khối lượng dữ liệu vừa và nhỏ và các tình huống sử dụng đơn giản, bạn nên sử dụng các biến bảng. (Đây là một hướng dẫn quá rộng và tất nhiên có rất nhiều trường hợp ngoại lệ - xem bên dưới và các bài viết tiếp theo.)
Một số điểm cần cân nhắc khi lựa chọn giữa chúng:
-
Bảng tạm thời là bảng thực nên bạn có thể thực hiện những việc như TẠO CHỈ SỐ, v.v. Nếu bạn có lượng lớn dữ liệu mà việc truy cập theo chỉ mục sẽ nhanh hơn thì bảng tạm thời là một lựa chọn tốt.
-
Các biến bảng có thể có chỉ mục bằng cách sử dụng các ràng buộc CHÍNH hoặc UNIQUE. (Nếu bạn muốn có chỉ mục không phải duy nhất, chỉ cần bao gồm cột khóa chính làm cột cuối cùng trong ràng buộc duy nhất. Nếu bạn không có cột duy nhất, bạn có thể sử dụng cột nhận dạng.) SQL 2014 cũng có chỉ mục không phải duy nhất .
-
Các biến trong bảng không tham gia vào các giao dịch và
SELECT
s được ngầm định vớiNOLOCK
. Hành vi giao dịch có thể rất hữu ích, chẳng hạn như nếu bạn muốn QUAY LẠI giữa chừng thông qua một thủ tục thì các biến bảng được điền trong giao dịch đó sẽ vẫn được điền! -
Các bảng tạm thời có thể dẫn đến việc các thủ tục được lưu trữ được biên dịch lại, có lẽ thường xuyên. Các biến bảng sẽ không.
-
Bạn có thể tạo bảng tạm thời bằng cách sử dụng CHỌN INTO, có thể viết nhanh hơn (tốt cho truy vấn đặc biệt) và có thể cho phép bạn giải quyết việc thay đổi kiểu dữ liệu theo thời gian, vì bạn không cần phải xác định trước cấu trúc bảng tạm thời của mình.
-
Bạn có thể chuyển lại các biến bảng từ các hàm, cho phép bạn đóng gói và sử dụng lại logic dễ dàng hơn nhiều (ví dụ:tạo một hàm để chia một chuỗi thành một bảng giá trị trên một số dấu phân cách tùy ý).
-
Sử dụng Biến bảng trong các hàm do người dùng xác định cho phép các hàm đó được sử dụng rộng rãi hơn (xem tài liệu TẠO CHỨC NĂNG để biết thêm chi tiết). Nếu bạn đang viết một hàm, bạn nên sử dụng các biến bảng trên bảng tạm thời trừ khi có nhu cầu hấp dẫn khác.
-
Cả hai biến bảng và bảng tạm thời đều được lưu trữ trong tempdb. Nhưng các biến bảng (kể từ năm 2005) được mặc định là đối chiếu của cơ sở dữ liệu hiện tại so với các bảng tạm thời lấy đối chiếu mặc định của tempdb (ref). Điều này có nghĩa là bạn nên biết các vấn đề đối chiếu nếu sử dụng bảng tạm thời và đối chiếu db của bạn khác với tempdb, gây ra sự cố nếu bạn muốn so sánh dữ liệu trong bảng tạm với dữ liệu trong cơ sở dữ liệu của mình.
-
Bảng tạm thời chung (## tmp) là một loại bảng tạm thời khác có sẵn cho tất cả các phiên và người dùng.
Một số bài đọc thêm:
-
Câu trả lời tuyệt vời của Martin Smith trên dba.stackexchange.com
-
Câu hỏi thường gặp về MSDN về sự khác biệt giữa hai loại:https://support.microsoft.com/en-gb/kb/305977
-
Bài viết trên blog MDSN:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table
-
Bài viết:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables
-
Các hành vi không mong muốn và ý nghĩa về hiệu suất của bảng tạm thời và biến tạm thời:Paul White trên SQLblog.com