Ada beberapa perbedaan antara Tabel Sementara (#tmp) dan Variabel Tabel (@tmp), meskipun menggunakan tempdb bukan salah satunya, seperti yang dijabarkan dalam tautan MSDN di bawah.
Sebagai aturan praktis, untuk volume data kecil hingga menengah dan skenario penggunaan sederhana, Anda harus menggunakan variabel tabel. (Ini adalah pedoman yang terlalu luas dengan tentu saja banyak pengecualian - lihat di bawah dan artikel berikut.)
Beberapa hal yang perlu dipertimbangkan ketika memilih di antara mereka:
-
Tabel Sementara adalah tabel nyata sehingga Anda dapat melakukan hal-hal seperti CREATE INDEXes, dll. Jika Anda memiliki data dalam jumlah besar yang mengakses dengan indeks akan lebih cepat maka tabel sementara adalah pilihan yang baik.
-
Variabel tabel dapat memiliki indeks dengan menggunakan KUNCI UTAMA atau kendala UNIK. (Jika Anda menginginkan indeks non-unik, cukup sertakan kolom kunci utama sebagai kolom terakhir dalam batasan unik. Jika Anda tidak memiliki kolom unik, Anda dapat menggunakan kolom identitas.) SQL 2014 juga memiliki indeks non-unik .
-
Variabel tabel tidak berpartisipasi dalam transaksi dan
SELECT
s secara implisit denganNOLOCK
. Perilaku transaksi dapat sangat membantu, misalnya jika Anda ingin melakukan ROLLBACK di tengah prosedur, maka variabel tabel yang diisi selama transaksi tersebut akan tetap terisi! -
Tabel temp mungkin mengakibatkan prosedur tersimpan dikompilasi ulang, mungkin sering. Variabel tabel tidak akan.
-
Anda dapat membuat tabel temp menggunakan SELECT INTO, yang bisa lebih cepat untuk ditulis (baik untuk kueri ad-hoc) dan memungkinkan Anda menangani perubahan tipe data dari waktu ke waktu, karena Anda tidak perlu mendefinisikan struktur tabel temp di awal.
-
Anda dapat meneruskan variabel tabel kembali dari fungsi, memungkinkan Anda untuk merangkum dan menggunakan kembali logika dengan lebih mudah (misalnya membuat fungsi untuk membagi string menjadi tabel nilai pada beberapa pembatas arbitrer).
-
Menggunakan Variabel Tabel dalam fungsi yang ditentukan pengguna memungkinkan fungsi tersebut digunakan lebih luas (lihat dokumentasi CREATE FUNCTION untuk detailnya). Jika Anda sedang menulis sebuah fungsi, Anda harus menggunakan variabel tabel di atas tabel sementara kecuali jika ada kebutuhan yang mendesak.
-
Variabel tabel dan tabel temp disimpan di tempdb. Tetapi variabel tabel (sejak 2005) default ke susunan database saat ini versus tabel temp yang mengambil susunan default tempdb (ref). Ini berarti Anda harus menyadari masalah pemeriksaan jika menggunakan tabel temp dan susunan db Anda berbeda dengan tempdb, menyebabkan masalah jika Anda ingin membandingkan data di tabel temp dengan data di database Anda.
-
Tabel Temp Global (##tmp) adalah jenis tabel temp lain yang tersedia untuk semua sesi dan pengguna.
Beberapa bacaan lebih lanjut:
-
Jawaban bagus Martin Smith di dba.stackexchange.com
-
FAQ MSDN tentang perbedaan antara keduanya:https://support.microsoft.com/en-gb/kb/305977
-
Artikel blog MDSN:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table
-
Artikel:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables
-
Perilaku tak terduga dan implikasi kinerja tabel temp dan variabel temp:Paul White di SQLblog.com