Các bảng tạm thời cục bộ và toàn cầu trong SQL Server


156

Sự khác biệt giữa các bảng tạm thời cục bộ và toàn cầu trong SQL Server là gì?


2
Dưới đây là một số chi tiết tóm tắt về điều này, Bấm vào đây
Jayesh Sorathia

5
Hãy cẩn thận khi sử dụng các biến bảng. Nếu bạn sử dụng chúng trong một truy vấn, chúng có thể dẫn đến các vấn đề hiệu suất nghiêm trọng với gói truy vấn của bạn vì chúng không được lập chỉ mục.

Trên thực tế, các bảng tạm thời có thể được lập chỉ mục, nếu cần, nhưng điều đó cũng tốn thời gian và tài nguyên, do đó nó vẫn có thể gây ra các vấn đề về hiệu năng hoặc tài nguyên.
Andrew Steitz

Câu trả lời:


114

Tôi thấy giải thích này khá rõ ràng (đó là bản sao thuần túy từ Technet ):

Có hai loại bảng tạm thời: cục bộ và toàn cầu. Các bảng tạm thời cục bộ chỉ hiển thị cho những người tạo của họ trong cùng một kết nối với một phiên bản của SQL Server như khi các bảng được tạo hoặc tham chiếu lần đầu tiên. Các bảng tạm thời cục bộ sẽ bị xóa sau khi người dùng ngắt kết nối với phiên bản SQL Server. Các bảng tạm thời toàn cầu hiển thị cho bất kỳ người dùng và bất kỳ kết nối nào sau khi chúng được tạo và bị xóa khi tất cả người dùng tham chiếu bảng ngắt kết nối với phiên bản của SQL Server.


Tuyệt vời, câu trả lời hữu ích! Tôi đang tìm kiếm thông tin cụ thể về việc nếu / khi các bảng tạm thời toàn cầu được SQL Server tự động dọn sạch.
kwill

Câu trả lời rất rõ ràng và súc tích. Bất cứ ai cũng có thể nghĩ về một trường hợp sử dụng tốt cho các bảng tạm thời toàn cầu? Một trong đó minh họa mục đích của họ trái ngược với mục đích của các bảng tạm thời địa phương?
Trevor

335
  • Các biến bảng ( DECLARE @t TABLE) chỉ hiển thị với kết nối tạo ra nó và bị xóa khi kết thúc lô hoặc thủ tục lưu trữ kết thúc.

  • Các bảng tạm thời cục bộ ( CREATE TABLE #t) chỉ hiển thị với kết nối tạo ra nó và bị xóa khi đóng kết nối.

  • Các bảng tạm thời toàn cầu ( CREATE TABLE ##t) hiển thị cho mọi người và bị xóa khi tất cả các kết nối đã tham chiếu chúng đã đóng.

  • Các bảng thường trực Tempdb ( USE tempdb CREATE TABLE t) hiển thị cho mọi người và bị xóa khi máy chủ được khởi động lại.


55
Cũng đáng chỉ ra: Các bảng tạm thời cục bộ bị xóa khi phạm vi tạo chúng được đóng lại. Vì vậy, nếu bạn tạo một bảng tạm thời cục bộ bên trong một trục quay, sau đó thử và truy cập nó bên ngoài trục quay đó - nó sẽ không tồn tại.

+1 cho Will. Tôi đã cố gắng sử dụng một bảng tạm thời cục bộ như một trình tối ưu hóa và tôi đã cố gắng sử dụng một thủ tục được lưu trữ như là một trình khởi tạo "tạo và điền nếu nó không tồn tại". Như bạn nói, nó không hoạt động trừ khi bạn sử dụng bảng tạm thời toàn cầu thay thế.
quillbreaker

9
"bị xóa khi tất cả các kết nối đã tham chiếu chúng đã đóng" - chính xác thì "đã tham chiếu chúng" nghĩa là gì? Nếu StoredProc từ một kết nối # 1 tạo ## TempTable, tôi có thể thấy nó từ một kết nối khác # 2 nói 10 phút sau (nếu kết nối # 2 đó hoạt động vào thời điểm tạo bảng?) TRẢ LỜI: Các bảng tạm thời toàn cầu sẽ tự động bị hủy khi phiên tạo bảng kết thúc và tất cả các tác vụ khác đã ngừng tham chiếu chúng. (xem thêm trên trang này trong câu trả lời khác nhau)
tbone

Tôi đã thử sử dụng một thủ tục được lưu trữ để tạo các bảng tạm thời cục bộ (#t) cần thiết theo logic tiếp theo, tuy nhiên hóa ra thủ tục được lưu trữ cha mẹ phải tạo chúng để chúng có sẵn cho các lệnh gọi thủ tục được lưu trữ con. Đây là một điều đáng buồn, bởi vì chúng tôi có một loạt các thủ tục được lưu trữ phải thiết lập các bảng theo cùng một cách và gọi xuống các sprocs thông thường. Các bảng tạm thời toàn cầu sẽ hoạt động trong trường hợp này khi các cuộc gọi trẻ em có quyền truy cập vào các bảng được tạo bởi anh chị em? Chúng tôi đang sử dụng SQL Server 2008
Brandon

1
@Brandon Bạn hoàn toàn đúng. Đó là thiếu chức năng. Hỗ trợ của TSQL cho phạm vi thích hợp của dữ liệu thoáng qua là khá sơ sài. Như thể các nhà thiết kế ngôn ngữ muốn mọi thứ trở nên toàn cầu. Và gần như không có hỗ trợ cho việc đóng cửa. Bạn có thể vượt qua một biến con trỏ. Nhưng đó là một con giun khác bởi vì hàng-agonizing-row không có cách nào để đi.
Anthony Faull

12

1.) Bảng tạm thời cục bộ chỉ tồn tại trong khoảng thời gian của kết nối hoặc, nếu được xác định bên trong câu lệnh ghép, trong khoảng thời gian của câu lệnh ghép.

Các bảng tạm thời cục bộ chỉ khả dụng cho phiên hoặc kết nối Máy chủ SQL (có nghĩa là một người dùng) đã tạo các bảng. Chúng sẽ tự động bị xóa khi phiên tạo các bảng đã bị đóng. Tên bảng tạm thời cục bộ được nhìn chằm chằm với dấu băm đơn ("#").

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

Phạm vi của bảng tạm thời cục bộ tồn tại cho phiên hiện tại của người dùng hiện tại có nghĩa là cửa sổ truy vấn hiện tại. Nếu bạn sẽ đóng cửa sổ truy vấn hiện tại hoặc mở một cửa sổ truy vấn mới và sẽ cố gắng tìm bảng tạm thời đã tạo ở trên, nó sẽ cung cấp cho bạn lỗi.


2.) Một bảng tạm thời toàn cầu vẫn còn trong cơ sở dữ liệu vĩnh viễn, nhưng các hàng chỉ tồn tại trong một kết nối nhất định. Khi kết nối được đóng lại, dữ liệu trong bảng tạm thời toàn cầu sẽ biến mất. Tuy nhiên, định nghĩa bảng vẫn còn với cơ sở dữ liệu để truy cập khi cơ sở dữ liệu được mở lần sau.

Các bảng tạm thời toàn cầu có sẵn cho tất cả các phiên hoặc kết nối của Máy chủ SQL (có nghĩa là tất cả người dùng). Chúng có thể được tạo bởi bất kỳ người dùng kết nối SQL Server nào và chúng sẽ tự động bị xóa khi tất cả các kết nối SQL Server đã bị đóng. Tên bảng tạm thời toàn cầu được hiển thị với dấu băm kép ("##").

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

Các bảng tạm thời toàn cầu hiển thị cho tất cả các kết nối SQL Server trong khi các bảng tạm thời cục bộ chỉ hiển thị với kết nối SQL Server hiện tại.


2
Định nghĩa của bạn về bảng tạm thời toàn cầu là cách tôi mong đợi nó hoạt động (đến từ các DB khác), nhưng thử nghiệm của tôi cho thấy những gì thực sự xảy ra trong SQL Server là: "Các bảng tạm thời toàn cầu sẽ tự động bị hủy khi phiên tạo bảng kết thúc và tất cả các nhiệm vụ khác đã ngừng tham chiếu chúng "
Nickolay

11

Trích dẫn từ Sách trực tuyến:

Các bảng tạm thời cục bộ chỉ hiển thị trong phiên hiện tại; bảng tạm thời toàn cầu được hiển thị cho tất cả các phiên.

Các bảng tạm thời được tự động loại bỏ khi chúng ra khỏi phạm vi, trừ khi được loại bỏ rõ ràng bằng cách sử dụng DROP TABLE:

  • Một bảng tạm thời cục bộ được tạo trong một thủ tục được lưu trữ sẽ tự động bị hủy khi thủ tục được lưu trữ hoàn thành. Bảng có thể được tham chiếu bởi bất kỳ thủ tục lưu trữ lồng nhau nào được thực hiện bởi thủ tục được lưu trữ đã tạo bảng. Bảng không thể được tham chiếu bởi quá trình gọi là thủ tục được lưu trữ đã tạo bảng.
  • Tất cả các bảng tạm thời cục bộ khác sẽ tự động bị hủy vào cuối phiên hiện tại.
  • Các bảng tạm thời toàn cầu sẽ tự động bị hủy khi phiên tạo bảng kết thúc và tất cả các tác vụ khác đã ngừng tham chiếu chúng. Sự kết hợp giữa một tác vụ và một bảng chỉ được duy trì trong suốt vòng đời của một câu lệnh Transact-SQL. Điều này có nghĩa là một bảng tạm thời toàn cầu bị loại bỏ khi hoàn thành câu lệnh Transact-SQL cuối cùng đang tham chiếu tích cực vào bảng khi phiên tạo kết thúc.

0

Các bảng tạm thời cục bộ : nếu bạn tạo các bảng tạm thời cục bộ và sau đó mở một kết nối khác và thử truy vấn, bạn sẽ gặp lỗi sau.

các bảng tạm thời chỉ có thể truy cập trong phiên tạo ra chúng.

Bảng tạm thời toàn cầu : Đôi khi, bạn có thể muốn tạo một bảng tạm thời có thể truy cập các kết nối khác. Trong trường hợp này, bạn có thể sử dụng các bảng tạm thời toàn cầu.

Các bảng tạm thời toàn cầu chỉ bị hủy khi tất cả các phiên đề cập đến nó được đóng lại.


0

Điều đáng nói là cũng có: các bảng tạm thời toàn cầu trong cơ sở dữ liệu (hiện chỉ được hỗ trợ bởi Cơ sở dữ liệu SQL SQL).

Các bảng tạm thời toàn cầu cho SQL Server (được khởi tạo với ## tên bảng) được lưu trữ trong tempdb và được chia sẻ giữa tất cả các phiên của người dùng trên toàn bộ phiên bản SQL Server.

Cơ sở dữ liệu Azure SQL hỗ trợ các bảng tạm thời toàn cầu cũng được lưu trữ trong tempdb và nằm trong phạm vi cơ sở dữ liệu. Điều này có nghĩa là các bảng tạm thời toàn cầu được chia sẻ cho tất cả các phiên của người dùng trong cùng một Cơ sở dữ liệu Azure SQL. Phiên người dùng từ cơ sở dữ liệu khác không thể truy cập các bảng tạm thời toàn cầu.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

THAY ĐỔI CẤU HÌNH XÁC NHẬN

GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

ÁP DỤNG CHO: Cơ sở dữ liệu Azure SQL (tính năng trong bản xem trước công khai)

Cho phép thiết lập chức năng tự động thả cho các bảng tạm thời toàn cầu. Mặc định là BẬT, có nghĩa là các bảng tạm thời toàn cầu sẽ tự động bị hủy khi không được sử dụng bởi bất kỳ phiên nào. Khi được đặt thành TẮT, các bảng tạm thời toàn cầu cần được loại bỏ rõ ràng bằng cách sử dụng câu lệnh DROP TABLE hoặc sẽ tự động bị hủy khi khởi động lại máy chủ.

Với cơ sở dữ liệu đơn Azure Azure cơ sở dữ liệu và nhóm đàn hồi, tùy chọn này có thể được đặt trong cơ sở dữ liệu người dùng cá nhân của máy chủ Cơ sở dữ liệu SQL. Trong phiên bản SQL Server và Azure SQL Database được quản lý, tùy chọn này được đặt trong TempDB và cài đặt cơ sở dữ liệu người dùng riêng lẻ không có hiệu lực.


0

Tôi không thấy bất kỳ câu trả lời nào cho người dùng thấy nơi chúng ta có thể tìm thấy bảng Global Temp. Bạn có thể xem các bảng tạm thời Địa phương và Toàn cầu ở cùng một vị trí khi điều hướng trong SSMS. Ảnh chụp màn hình dưới đây được lấy từ liên kết này .

Cơ sở dữ liệu -> Cơ sở dữ liệu hệ thống -> tempdb -> Bảng tạm thời

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.