Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 11952|Jawab: 0

[Sumber] Penjelasan terperinci tentang tabel sementara dalam database SQL Server

[Salin tautan]
Diposting pada 28/05/2020 10.52.28 | | | |
Tabel sementara sangat penting dalam database Sqlserver, dan berikut ini adalah pengantar terperinci tentang karakteristik dan penggunaan tabel sementara dalam database SQL, hanya untuk referensi.

Tabel sementara mirip dengan tabel persisten, tetapi tabel sementara disimpan dalam tempdb dan secara otomatis dihapus saat tidak lagi digunakan. Ada dua jenis tabel sementara: lokal dan global. Mereka dibedakan berdasarkan nama, visibilitas, dan ketersediaan.

Tabel sementara memiliki karakteristik sebagai berikut:

  • Tabel sementara lokal adalah tabel yang pengguna menambahkan awalan "#" saat membuat tabel, yang independen sesuai dengan koneksi database. Hanya koneksi database yang membuat tabel sementara lokal yang memiliki akses ke tabel, dan koneksi lain tidak dapat mengakses tabel.
  • Dalam koneksi database yang berbeda, meskipun tabel sementara lokal yang dibuat memiliki "nama" yang sama, tabel ini tidak memiliki hubungan satu sama lain. Di SQLSERVER, mekanisme penamaan khusus memastikan independensi tabel sementara lokal dalam koneksi database.
  • Tabel sementara sejati memanfaatkan ruang tabel sementara database, yang secara otomatis dikelola oleh sistem database, sehingga menghemat ruang tabel. Dan karena tablespace sementara umumnya menggunakan memori virtual, jumlah I/O pada hard disk sangat berkurang, sehingga efisiensi sistem juga ditingkatkan.
  • Tabel sementara secara otomatis dikosongkan setelah transaksi atau sesi selesai, sehingga Anda tidak perlu ingat untuk menghapus data setelah habis.


Tabel sementara lokal

Nama tabel sementara lokal diawali dengan simbol numerik tunggal (#); Mereka hanya terlihat oleh koneksi pengguna saat ini (yaitu koneksi yang membuat tabel sementara lokal); Ini dihapus saat pengguna memutuskan sambungan dari instans SQL Server.

Misalnya, kita membuat tabel sementara lokal dalam koneksi database dengan pernyataan berikut: #Temp

Koneksi Database 1:



Kemudian mulai koneksi database 2 secara bersamaan untuk melakukan #temp kueri

Koneksi Database 2:



Mari kita lihat apa hasil dari koneksi database 2?

Koneksi Database 2:



Hasilnya menunjukkan bahwa koneksi database 2 tidak dapat menemukan tabel #Temp. Ini berarti bahwa #Temp tabel sementara hanya terlihat oleh koneksi database 1 yang membuatnya, tetapi tidak ke koneksi database 2.

Tabel sementara global

Nama tabel sementara global diawali dengan dua simbol numerik (##) dan terlihat oleh koneksi database apa pun saat dibuat, dan dihapus ketika semua koneksi database yang mereferensikan tabel terputus dari SQL Server.

Misalnya, kita membuat tabel sementara global ##Temp dalam koneksi database dengan pernyataan berikut, lalu menyisipkan tiga baris data

Koneksi Database 1:



Kemudian kita kueri ##Temp的数据 dalam koneksi database 2

Koneksi Database 2:



Hasil koneksi database 2 adalah sebagai berikut

Koneksi Database 2:



Seperti yang Anda lihat, koneksi database 2 dapat berhasil mengakses tabel sementara global ##Temp yang dibuat oleh koneksi database 1, tetapi jika kita menutup koneksi data 1 sekarang dan kemudian menjalankan ##Temp查询语句会发生什么呢 koneksi database 2? Hasilnya adalah sebagai berikut:

Tutup koneksi database 1, lalu koneksi database 2 dijalankan lagi:



Kami menemukan bahwa setelah menutup koneksi database 1, koneksi database 2 tidak dapat menemukan tabel sementara global ##Temp了. Ini karena setelah koneksi database 1 ditutup, tidak ada pernyataan dalam koneksi database 2 yang menggunakan tabel sementara ##Temp, sehingga sqlserver berpikir bahwa tidak ada koneksi database yang mereferensikan tabel sementara global ##Temp了 saat ini, sehingga akan ##Temp释放掉了.


Selanjutnya, kita mencoba menutup tabel temp global ##Temp持有事务中的排他锁 (X-lock) di koneksi database 2 dan kemudian menutup koneksi database 1.

Koneksi Database 1:



Koneksi Database 2:



Tutup koneksi database 1, lalu koneksi database 2 menjalankan:



Hasilnya menunjukkan bahwa meskipun kita menutup koneksi database 1, karena koneksi database 2 telah memegang tabel sementara global ##Temp的排他锁 (kunci X) dalam transaksi, tabel sementara # #Temp并没有随着数据库连接1的关闭而被释放掉, selama transaksi yang dimulai di koneksi database 2 tidak diputar kembali atau dilakukan, maka koneksi database 2 akan selalu menyimpan tabel sementara ##Temp的排他锁. Pada saat ini, Sqlserver akan berpikir bahwa masih ada koneksi database yang mereferensikan tabel temp global ##Temp, jadi ##Temp不会被释放掉.




Mantan:Pengakses properti TypeScript (set,get)
Depan:SQL Server mengkueri hari-hari sebelumnya dari waktu sistem saat ini
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com