Dari pos ini Bagaimana cara menggunakan ROW_NUMBER dalam prosedur berikut?
Ada dua versi jawaban di mana satu menggunakan a sub-query
dan yang lainnya menggunakan a CTE
untuk menyelesaikan masalah yang sama.
Nah, apa keuntungan menggunakan CTE (Common Table Expression)
lebih dari 'sub-permintaan` (dengan demikian, lebih mudah dibaca apa yang sebenarnya dilakukan permintaan)
Satu-satunya keuntungan dari menggunakan CTE
lebih sub-select
adalah bahwa saya benar-benar dapat nama itu sub-query
. Apakah ada perbedaan lain antara keduanya ketika CTE digunakan sebagai CTE sederhana (non-rekursif)?
sql
sql-server
tsql
subquery
common-table-expression
dance2die
sumber
sumber
Jawaban:
Dalam versi CTE sub-kueri vs sederhana (non-rekursif), mereka mungkin sangat mirip. Anda harus menggunakan profiler dan rencana eksekusi aktual untuk menemukan perbedaan, dan itu akan spesifik untuk pengaturan Anda (jadi kami tidak dapat memberi tahu Anda jawabannya secara penuh).
Secara umum ; CTE dapat digunakan secara rekursif; sub-kueri tidak bisa. Ini membuatnya sangat cocok untuk struktur pohon.
sumber
A CTE can be used recursively; a sub-query cannot
. Sebuah contoh akan sangat bagus.Keuntungan utama dari Common Table Expression (ketika tidak menggunakannya untuk permintaan rekursif ) adalah enkapsulasi, alih-alih harus mendeklarasikan sub-kueri di setiap tempat yang ingin Anda gunakan, Anda dapat mendefinisikannya sekali, tetapi memiliki banyak referensi untuk itu.
Namun, ini tidak berarti bahwa itu dijalankan hanya sekali (sesuai per iterasi sebelumnya dari jawaban ini , terima kasih untuk semua yang telah berkomentar). Permintaan pasti berpotensi dieksekusi beberapa kali jika direferensikan beberapa kali; pengoptimal permintaan akhirnya membuat keputusan tentang bagaimana CTE harus ditafsirkan.
sumber
CTE
Yang paling berguna untuk rekursi:akan mengembalikan
@n
baris (hingga101
). Berguna untuk kalender, rowset dummy dll.Mereka juga lebih mudah dibaca (menurut saya).
Terlepas dari ini,
CTE
dansubqueries
identik.sumber
;WITH blabla AS ...)
WITH
,MERGE
dan serupaSatu perbedaan yang belum disebutkan adalah CTE tunggal dapat dirujuk di beberapa bagian serikat
sumber
Kecuali jika saya melewatkan sesuatu, Anda dapat memberi nama CTE dan subquery dengan mudah.
Saya kira perbedaan utamanya adalah keterbacaan (saya menemukan CTE lebih mudah dibaca karena mendefinisikan subquery Anda di depan daripada di tengah).
Dan jika Anda perlu melakukan sesuatu dengan rekursi, Anda akan mengalami sedikit kesulitan melakukan itu dengan subquery;)
sumber
Satu fakta penting yang belum pernah disebutkan oleh siapa pun adalah bahwa (setidaknya dalam postgres), CTE adalah pagar pengoptimalan:
https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/
Artinya, mereka akan diperlakukan sebagai permintaan atom mereka sendiri, daripada dilipat ke dalam rencana kueri keseluruhan. Saya kurang memiliki keahlian untuk memberikan penjelasan yang lebih baik, tetapi Anda harus memeriksa semantik untuk versi sql yang Anda gunakan; untuk pengguna tingkat lanjut, dapat membuat pagar pengoptimalan dapat membantu kinerja jika Anda ahli dalam mengendalikan perencana kueri; dalam 99% kasus, Anda harus menghindari mencoba memberi tahu perencana kueri apa yang harus dilakukan, karena apa yang menurut Anda akan lebih cepat cenderung lebih buruk daripada apa yang menurutnya akan lebih cepat. :-)
sumber
Menambahkan ke jawaban orang lain, jika Anda memiliki satu dan subquery yang sama digunakan beberapa kali, Anda dapat mengganti semua subqueries ini dengan satu CTE. Ini memungkinkan Anda menggunakan kembali kode Anda dengan lebih baik.
sumber
Satu hal yang perlu Anda pahami juga adalah bahwa dalam versi SQL Server yang lebih lama (ya banyak orang masih perlu mendukung database SQL Server 2000), CTE tidak diperbolehkan dan kemudian tabel turunannya adalah solusi terbaik Anda.
sumber
PETUNJUK: (MAXRECURSION n)
Misalnya, Anda dapat mencoba:
sumber