Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengapa CTE (Common Table Expressions) dalam beberapa kasus memperlambat kueri dibandingkan dengan tabel sementara di SQL Server

Jawabannya sederhana.

SQL Server tidak mewujudkan CTE. Ini membuat mereka sejajar, seperti yang Anda lihat dari rencana eksekusi.

DBMS lain mungkin mengimplementasikannya secara berbeda, contoh yang terkenal adalah Postgres, yang mewujudkan CTE (pada dasarnya membuat tabel sementara untuk CTE di belakang kap).

Apakah perwujudan eksplisit hasil perantara dalam tabel sementara eksplisit lebih cepat, tergantung pada kueri.

Dalam kueri kompleks, overhead penulisan dan pembacaan data perantara ke dalam tabel sementara dapat diimbangi dengan rencana eksekusi sederhana yang lebih efisien yang dapat dihasilkan oleh pengoptimal.

Di sisi lain, di Postgres CTE adalah "pagar optimasi" dan mesin tidak dapat mendorong predikat melintasi batas CTE.

Terkadang satu cara lebih baik, terkadang cara lain. Setelah kompleksitas kueri tumbuh melampaui ambang batas tertentu, pengoptimal tidak dapat menganalisis semua cara yang mungkin untuk memproses data dan harus menyelesaikan sesuatu. Misalnya, urutan untuk bergabung dengan tabel. Jumlah permutasi tumbuh secara eksponensial dengan jumlah tabel untuk dipilih. Pengoptimal memiliki waktu terbatas untuk membuat rencana, sehingga mungkin membuat pilihan yang buruk saat semua CTE disejajarkan. Saat Anda memecah kueri kompleks menjadi kueri sederhana yang lebih kecil secara manual, Anda perlu memahami apa yang Anda lakukan, tetapi pengoptimal memiliki peluang lebih baik untuk menghasilkan rencana yang baik untuk setiap kueri sederhana.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bandingkan 2 tabel di sql

  2. Hasilkan nilai DISTINCT di STRING_AGG

  3. SEPERTI vs BERISI di SQL Server

  4. Cara menghasilkan Script untuk Menambahkan Batasan Default ke Kolom di Beberapa Tabel di Database SQL Server - Tutorial SQL Server / TSQL Bagian 94

  5. SQL Server - Cara terbaik untuk mendapatkan identitas baris yang disisipkan?