Saya memiliki sedikit pengalaman dengan kedua struktur ini. Apakah ada peningkatan kinerja menggunakan satu atau lain untuk menggunakan tabel temp? Saya tahu bahwa pilih ke dalam membuat tabel yang bertahan setelah kueri ...

0
Helio Junior 5 April 2021, 18:18

2 jawaban

Jawaban Terbaik

Anda membingungkan dua konsep.

SELECT INTO Membuat tabel baru. Itu bisa menjadi tabel sementara atau tabel permanen. Tetapi tabel dibuat.

WITH mendefinisikan ekspresi tabel umum (cte) yang digunakan dalam satu kueri. Ini bukan "tabel". Ini hanyalah subquery dan mungkin atau mungkin tidak terwujud sebagai tabel sementara (sebenarnya, SQL Server biasanya tidak mewujudkan CTES).

Anda menggunakan SELECT INTO ketika Anda menginginkan meja nyata. Beberapa alasan untuk itu adalah:

  • Berbagi data di antara banyak pertanyaan.
  • Mengumpulkan statistik yang benar untuk membantu pengoptimal kueri.
  • Menambahkan indeks untuk meningkatkan kinerja kueri selanjutnya.

Anda menggunakan CTE ketika Anda ingin subquery bernama dalam kueri. Jika Anda memilih di antara keduanya, Anda mungkin ingin memulai dengan CTE.

5
Gordon Linoff 5 April 2021, 15:21

Oh boy dimana saya mulai?

Pertama, lihat:

Apa perbedaan utama antara tabel CTE dan TEMP?

Ada perbedaan besar antara keduanya.

Temp dan Tempel Temp Global

  • Dapat diindeks
  • Bertahan melewati pernyataan yang menciptakannya
  • Disimpan di Tempdb untuk sesi saat ini

Cte

  • Set Hasil Sementara

  • Dapat digunakan untuk rekursi

  • Lingkup adalah pernyataan

Sekarang mari kita bicara tentang beberapa hal anekdotal, atau hal umum yang akan Anda lihat:

Mereka mengatakan membuat kueri tabel dengan tabel temp dioptimalkan untuk kinerja massal massal, meskipun saya pikir saya ingat membaca bahwa di SQL Server 2019 itu tidak lagi terjadi, tetapi saya belum melihat bukti untuk mendukungnya. Yang sedang berkata, itu adalah cara yang sangat nyaman untuk mereplikasi struktur meja dengan cepat, jadi itu adalah teknik yang akan Anda lihat di banyak tempat.

Teknik tabel temp umum lainnya digunakan untuk melakukan prefilter hasil yang ditetapkan alih-alih mencoba bergabung dengan tabel besar di sisi kiri bergabung dengan meja lain di sisi kanan. Ini menyebabkan banyak baca dan sering masuk akal untuk mengambil irisan yang Anda butuhkan dari tabel pertama menjadi tabel temp untuk mendapatkan kinerja dengan menghindari perilaku itu. Sekali lagi, ini sangat umum dan sesuatu yang harus Anda gunakan untuk berpikir ketika bekerja dengan bergabung dan meja yang lebih besar.

Menggunakan serangkaian CTE untuk bergabung - Ive melihat ini banyak dan selalu buruk. Anda akhirnya kehilangan kinerja dengan semua tabel hash dan looping yang diperlukan untuk bergabung dengan beberapa CTE di kueri Pilih akhir. Itu selalu berakhir dengan jumlah bruto dari baca yang tidak perlu.

Untuk apa nilainya, sebagian besar waktu dengan CTE, kecuali Anda menggunakannya untuk logika rekursif atau untuk membangun produk Cartesian yang cepat / mudah (atau semacam daftar lain yang mudah dibangun), saya hampir selalu menulis ulang teknik lain . Itu belum tentu semacam rasa pribadi, saya hanya berpikir dalam konteks normal kemampuan untuk mengindeks tabel temp dan variabel tabel untuk menjadi berharga. Dan umumnya kurang berbunyi terjadi di atas semua. Idenya di sini adalah untuk memastikan Anda menganalisis kedua pendekatan dan memilih yang terbaik secara keseluruhan.

2
Doug Coats 5 April 2021, 15:44