Tabel sementara lokal dan global di SQL Server

156

Apa perbedaan antara tabel sementara lokal dan global di SQL Server?

andrew Sullivan
sumber
2
Berikut adalah beberapa ringkasan ringkasan tentang ini, Klik Di Sini
Jayesh Sorathia
5
Hati-hati saat menggunakan variabel tabel. Jika Anda menggunakannya dalam kueri, mereka dapat menyebabkan masalah kinerja serius dengan rencana kueri Anda karena mereka tidak diindeks.
Sebenarnya, tabel temp dapat diindeks, jika diperlukan, tetapi itu membutuhkan waktu dan sumber daya juga, sehingga masih dapat menyebabkan masalah kinerja atau sumber daya.
Andrew Steitz

Jawaban:

114

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.

Mengenakan
sumber
Hebat, jawaban yang sangat membantu! Saya sedang mencari informasi spesifik tentang jika / ketika tabel temp global secara otomatis dibersihkan oleh SQL Server.
kwill
Jawabannya sangat jelas dan ringkas. Adakah yang bisa memikirkan kasus penggunaan yang baik untuk tabel temp global? Salah satu yang menggambarkan tujuan mereka berbeda dengan tujuan temp temp tables?
Trevor
336
  • 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.

Anthony Faull
sumber
55
Juga patut ditunjukkan: Tabel sementara lokal dihapus ketika cakupan yang membuatnya ditutup. Jadi, jika Anda membuat tabel temp lokal di dalam sproc, lalu coba aksesnya di luar sproc - itu tidak akan ada.
+1 untuk Will. Saya mencoba menggunakan tabel sementara lokal sebagai pengoptimal dan saya mencoba menggunakan prosedur tersimpan sebagai "buat dan isi jika tidak ada" penginisialisasi. Seperti yang Anda katakan, itu tidak berfungsi kecuali Anda menggunakan tabel sementara global sebagai gantinya.
quillbreaker
9
"Dihapus ketika semua koneksi yang telah mereferensikannya telah ditutup" - apa arti "yang telah mereferensikan mereka"? Jika StoredProc dari satu koneksi # 1 menciptakan ## TempTable dapatkah saya melihatnya dari koneksi lain # 2 katakan 10 menit kemudian (jika koneksi # 2 itu aktif pada waktu pembuatan tabel?) JAWABAN: Tabel sementara global secara otomatis dihapus ketika sesi yang membuat tabel berakhir dan semua tugas lain berhenti merujuknya. (lihat lebih lanjut di halaman ini dalam jawaban yang berbeda)
tbone
Saya mencoba menggunakan prosedur tersimpan untuk membuat tabel sementara lokal (#t) yang diperlukan oleh logika berikutnya, namun ternyata prosedur yang disimpan orang tua harus membuatnya agar mereka tersedia untuk panggilan prosedur tersimpan anak-anak. Ini adalah hal yang menyedihkan, karena kami memiliki banyak prosedur tersimpan yang harus mengatur tabel dengan cara yang sama dan memanggil ke dalam sprocs umum. Akankah tabel temp global berfungsi dalam kasus ini di mana panggilan anak-anak memiliki akses ke tabel yang dibuat oleh saudara kandung? Kami menggunakan SQL Server 2008.
Brandon
1
@ Brandon Kau benar sekali. Itu adalah fungsionalitas yang hilang. Dukungan TSQL untuk pelingkupan yang tepat atas data sementara cukup samar. Seolah-olah para perancang bahasa ingin semuanya menjadi global. Dan hampir tidak ada dukungan untuk penutupan. Anda bisa melewatkan variabel kursor. Tapi itu adalah cacing lain karena deretan demi derita tidak ada jalan lain.
Anthony Faull
12

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.

Vivek S.
sumber
2
Definisi Anda tentang tabel temp global adalah bagaimana saya mengharapkannya berperilaku (berasal dari DB lain), tetapi pengujian saya menunjukkan bahwa apa yang sebenarnya terjadi di SQL Server adalah: "Tabel temporer global secara otomatis dihapus ketika sesi yang membuat tabel berakhir dan semua tugas lain telah berhenti merujuk mereka "
Nickolay
11

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 yang dibuat dalam prosedur tersimpan dijatuhkan secara otomatis ketika prosedur tersimpan selesai. Tabel dapat dirujuk oleh prosedur tersimpan bersarang yang dijalankan oleh prosedur tersimpan yang membuat tabel. Tabel tidak dapat dirujuk oleh proses yang disebut prosedur tersimpan yang membuat tabel.
  • Semua tabel sementara lokal lainnya dijatuhkan secara otomatis pada akhir sesi saat ini.
  • Tabel temporer global secara otomatis dihapus ketika sesi yang membuat tabel berakhir dan semua tugas lain telah berhenti merujuknya. Asosiasi antara tugas dan tabel dipertahankan hanya untuk kehidupan pernyataan Transact-SQL tunggal. Ini berarti bahwa tabel sementara global dijatuhkan pada penyelesaian pernyataan Transact-SQL terakhir yang secara aktif mereferensikan tabel saat sesi pembuatan berakhir.
Christian Hayter
sumber
0

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.

Reza Jenabi
sumber
0

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'

ALTER DATABASE CONFIGURATION

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.

Lukasz Szozda
sumber
0

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

masukkan deskripsi gambar di sini

Kode Pemula
sumber