Apa perbedaan antara tabel sementara lokal dan global di SQL Server?
Apa perbedaan antara tabel sementara lokal dan global di SQL Server?
Jawaban:
Saya menemukan penjelasan ini cukup jelas (ini salinan murni dari Technet ):
Ada dua jenis tabel sementara: lokal dan global. Tabel sementara lokal hanya dapat dilihat oleh pembuatnya selama koneksi yang sama ke turunan dari SQL Server seperti ketika tabel pertama kali dibuat atau direferensikan. Tabel sementara lokal dihapus setelah pengguna terputus dari contoh SQL Server. Tabel sementara global terlihat oleh pengguna mana saja dan koneksi apa pun setelah dibuat, dan dihapus ketika semua pengguna yang merujuk tabel putuskan sambungan dari instance SQL Server.
Variabel tabel ( DECLARE @t TABLE
) hanya terlihat oleh koneksi yang membuatnya, dan dihapus ketika batch atau prosedur tersimpan berakhir.
Tabel sementara lokal ( CREATE TABLE #t
) hanya terlihat oleh koneksi yang membuatnya, dan dihapus ketika koneksi ditutup.
Tabel sementara global ( CREATE TABLE ##t
) dapat dilihat oleh semua orang, dan dihapus ketika semua koneksi yang merujuknya telah ditutup.
Tabel permanen Tempdb ( USE tempdb CREATE TABLE t
) dapat dilihat oleh semua orang, dan dihapus ketika server dihidupkan ulang.
1.) Tabel sementara lokal hanya ada selama durasi koneksi atau, jika didefinisikan di dalam pernyataan gabungan, untuk durasi pernyataan gabungan.
Tabel temp lokal hanya tersedia untuk sesi atau koneksi SQL Server (berarti pengguna tunggal) yang membuat tabel. Ini secara otomatis dihapus ketika sesi yang membuat tabel telah ditutup. Nama tabel temporer lokal ditandai dengan tanda hash ("#") tunggal.
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp
Lingkup tabel temp lokal ada untuk sesi saat ini dari pengguna saat ini berarti ke jendela permintaan saat ini. Jika Anda akan menutup jendela kueri saat ini atau membuka jendela kueri baru dan akan mencoba menemukan tabel temp yang dibuat di atas, itu akan memberi Anda kesalahan.
2.) Tabel sementara global tetap ada di database secara permanen, tetapi baris hanya ada dalam koneksi yang diberikan. Ketika koneksi ditutup, data dalam tabel sementara global menghilang. Namun, definisi tabel tetap dengan database untuk akses ketika database dibuka waktu berikutnya.
Tabel temp global tersedia untuk semua sesi atau koneksi SQL Server (berarti semua pengguna). Ini dapat dibuat oleh pengguna koneksi SQL Server dan ini secara otomatis dihapus ketika semua koneksi SQL Server telah ditutup. Nama tabel sementara global ditatap dengan tanda hash ganda ("##").
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp
Tabel sementara global terlihat oleh semua koneksi SQL Server sementara tabel sementara lokal hanya dapat dilihat oleh koneksi SQL Server saat ini.
Mengutip dari Buku Daring:
Tabel sementara lokal hanya terlihat di sesi saat ini; tabel sementara global terlihat oleh semua sesi.
Tabel sementara secara otomatis dihapus ketika mereka keluar dari ruang lingkup, kecuali secara eksplisit dijatuhkan menggunakan DROP TABLE:
Tabel sementara lokal : jika Anda membuat tabel sementara lokal dan kemudian membuka koneksi lain dan mencoba kueri, Anda akan mendapatkan kesalahan berikut.
tabel sementara hanya dapat diakses dalam sesi yang membuatnya.
Tabel sementara global : Terkadang, Anda mungkin ingin membuat tabel sementara yang dapat diakses koneksi lain. Dalam hal ini, Anda bisa menggunakan tabel sementara global.
Tabel sementara global hanya dimusnahkan ketika semua sesi yang merujuk padanya ditutup.
Perlu disebutkan bahwa ada juga: basis data global sementara tabel (saat ini hanya didukung oleh Azure SQL Database)
Tabel sementara global untuk SQL Server (dimulai dengan nama tabel ##) disimpan dalam tempdb dan dibagi di antara semua sesi pengguna di seluruh instance SQL Server.
Azure SQL Database mendukung tabel sementara global yang juga disimpan dalam tempdb dan dicakup ke tingkat basis data. Ini berarti bahwa tabel sementara global dibagi untuk semua sesi pengguna dalam Azure SQL Database yang sama. Sesi pengguna dari database lain tidak dapat mengakses tabel sementara global.
-- 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'
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
BERLAKU UNTUK: Database SQL Azure (fitur dalam pratinjau publik)
Mengizinkan pengaturan fungsi penurunan otomatis untuk tabel sementara global. Standarnya adalah ON, yang berarti bahwa tabel sementara global secara otomatis dihapus ketika tidak digunakan oleh sesi apa pun. Ketika diatur ke OFF, tabel sementara global harus secara eksplisit dihapus menggunakan pernyataan DROP TABLE atau akan secara otomatis dijatuhkan pada server restart.
Dengan database tunggal Azure SQL Database dan kolam elastis, opsi ini dapat diatur dalam database pengguna individual dari server Database SQL. Dalam contoh yang dikelola SQL Server dan Azure SQL Database, opsi ini diatur dalam TempDB dan pengaturan masing-masing basis data pengguna tidak berpengaruh.
Saya tidak melihat jawaban yang menunjukkan kepada pengguna di mana kami dapat menemukan tabel Global Temp. Anda dapat melihat tabel temp Lokal dan Global di lokasi yang sama saat menavigasi dalam SSMS. Cuplikan layar di bawah ini diambil dari tautan ini .
Database -> System Database -> tempdb -> Tabel Sementara