SUNTING:
Silakan lihat komentar Martin di bawah ini:
CTE tidak terwujud sebagai tabel dalam memori. Itu hanya cara merangkum definisi permintaan. Dalam kasus OP, itu akan digarisbawahi dan sama dengan hanya melakukan SELECT Column1, Column2, Column3 FROM SomeTable
. Sebagian besar waktu mereka tidak terwujud di muka, itulah sebabnya ini tidak mengembalikan baris WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
, juga memeriksa rencana eksekusi. Meskipun terkadang ada kemungkinan untuk meretas rencana untuk mendapatkan gulungan. Ada item sambung yang meminta petunjuk untuk ini. - Martin Smith 15 Feb '12 pada 17:08
Jawaban asli
CTE
Baca lebih lanjut tentang MSDN
CTE membuat tabel yang digunakan dalam memori, tetapi hanya valid untuk kueri spesifik yang mengikutinya. Saat menggunakan rekursi, ini bisa menjadi struktur yang efektif.
Anda mungkin juga ingin mempertimbangkan menggunakan variabel tabel. Ini digunakan sebagai tabel temp digunakan dan dapat digunakan beberapa kali tanpa perlu direalisasikan kembali untuk setiap bergabung. Juga, jika Anda perlu bertahan beberapa catatan sekarang, tambahkan beberapa catatan lagi setelah pilih berikutnya, tambahkan beberapa catatan lagi setelah op lain, lalu kembalikan hanya segelintir catatan itu, maka ini bisa menjadi struktur yang berguna, karena tidak perlu dijatuhkan setelah eksekusi. Sebagian besar hanya gula sintaksis. Namun, jika Anda tetap menghitung baris rendah, itu tidak pernah terwujud ke disk. Lihat apa perbedaan antara variabel tabel temp dan tabel dalam SQL Server? untuk lebih jelasnya.
Tabel Temp
Baca lebih lanjut tentang MSDN - Gulir ke bawah sekitar 40% dari jalan
Tabel temp secara harfiah adalah tabel yang dibuat di disk, hanya dalam database tertentu yang semua orang tahu dapat dihapus. Adalah tanggung jawab seorang dev yang baik untuk menghancurkan tabel-tabel itu ketika mereka tidak lagi dibutuhkan, tetapi DBA juga dapat menghapusnya.
Tabel sementara datang dalam dua variasi: Lokal dan global. Dalam hal MS Sql Server Anda menggunakan #tableName
penunjukan untuk lokal, dan ##tableName
penunjukan untuk global (perhatikan penggunaan # tunggal atau ganda sebagai karakteristik pengidentifikasi).
Perhatikan bahwa dengan temp tables, sebagai kebalikan dari variabel table atau CTE, Anda dapat menerapkan indeks dan sejenisnya, karena ini adalah tabel yang sah dalam arti kata yang normal.
Secara umum saya akan menggunakan tabel temp untuk kueri yang lebih panjang atau lebih besar, dan variabel CTE atau tabel jika saya sudah memiliki dataset kecil dan ingin dengan cepat membuat skrip sedikit kode untuk sesuatu yang kecil. Pengalaman dan saran orang lain menunjukkan bahwa Anda harus menggunakan CTE di mana Anda memiliki sejumlah kecil baris yang dikembalikan darinya. Jika Anda memiliki jumlah besar, Anda mungkin akan mendapat manfaat dari kemampuan untuk mengindeks pada tabel temp.