SQL adalah bahasa deklaratif, bukan bahasa prosedural. Artinya, Anda membangun pernyataan SQL untuk menggambarkan hasil yang Anda inginkan. Anda tidak memberi tahu mesin SQL cara melakukan pekerjaan.
Sebagai aturan umum, sebaiknya mesin SQL dan pengoptimal SQL menemukan rencana kueri terbaik. Ada banyak upaya orang-tahun yang dikembangkan untuk mengembangkan mesin SQL, jadi biarkan para insinyur melakukan apa yang mereka tahu bagaimana melakukannya.
Tentu saja, ada situasi di mana rencana kueri tidak optimal. Kemudian Anda ingin menggunakan petunjuk kueri, menyusun ulang kueri, memperbarui statistik, menggunakan tabel sementara, menambahkan indeks, dan sebagainya untuk mendapatkan kinerja yang lebih baik.
Adapun pertanyaan Anda. Secara teori, kinerja CTE dan subkueri harus sama karena keduanya memberikan informasi yang sama kepada pengoptimal kueri. Satu perbedaan adalah bahwa CTE yang digunakan lebih dari satu kali dapat dengan mudah diidentifikasi dan dihitung satu kali. Hasilnya kemudian dapat disimpan dan dibaca beberapa kali. Sayangnya, SQL Server tampaknya tidak mengambil keuntungan dari metode optimasi dasar ini (Anda mungkin menyebut ini penghapusan subquery umum).
Tabel sementara adalah masalah yang berbeda, karena Anda memberikan lebih banyak panduan tentang bagaimana kueri harus dijalankan. Satu perbedaan utama adalah bahwa pengoptimal dapat menggunakan statistik dari tabel sementara untuk membuat rencana kueri. Ini dapat menghasilkan keuntungan kinerja. Juga, jika Anda memiliki CTE (subquery) rumit yang digunakan lebih dari satu kali, maka menyimpannya dalam tabel sementara akan sering memberikan peningkatan kinerja. Permintaan dieksekusi hanya sekali.
Jawaban untuk pertanyaan Anda adalah bahwa Anda perlu bermain-main untuk mendapatkan kinerja yang Anda harapkan, terutama untuk permintaan kompleks yang dijalankan secara teratur. Di dunia yang ideal, optimizer kueri akan menemukan jalur eksekusi yang sempurna. Meskipun sering demikian, Anda mungkin dapat menemukan cara untuk mendapatkan kinerja yang lebih baik.