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不会被释放掉. |