WITH w AS NOT MATERIALIZED ( SELECT * FROM very_very_big_table ) SELECT * FROM w AS w1 JOIN w AS w2 ON w1.key = w2.ref WHERE w2.key = 123;
Hari ini, sebuah komit telah jatuh ke dalam repositori PostgreSQL, yang memungkinkan Anda untuk mengontrol perilaku pemrosesan subquery CTE, yaitu: Anda sekarang dapat secara eksplisit menunjukkan apakah subquery akan terwujud secara terpisah atau apakah akan dieksekusi sebagai bagian dari satu permintaan besar.
Ini akan masuk ke PostgreSQL 12 dan ini adalah masalah besar. Mari kita lihat alasannya
Programmer menyukai CTE karena dapat secara signifikan meningkatkan keterbacaan kode. Memang, beberapa pertanyaan analitik dapat bekerja dengan puluhan tabel dan berbagai pengelompokan dan filter. Untuk menulis semua ini dalam satu permintaan besar - dijamin mendapatkan sesuatu yang tidak dapat dibaca. Oleh karena itu, dengan menggunakan operator WITH
, kami secara berurutan, dalam subkueri kecil (yang diberi nama yang dapat dibaca manusia) menggambarkan logika kerja, dan kemudian menghasilkan hasilnya. Sangat nyaman
Lebih tepatnya, akan sangat nyaman jika itu bukan karena satu hal: PostgreSQL saat ini mengeksekusi subquery ini secara terpisah dari satu sama lain, mematerialisasikannya (menulis hasilnya ke tabel sementara). Ini dapat menyebabkan pelambatan yang signifikan dibandingkan dengan satu monster besar yang tidak dapat dibaca. Terutama jika subquery CTE mengembalikan jutaan baris.
Namun, ada situasi ketika eksekusi terpisah seperti itu bekerja untuk kebaikan: ada trik optimasi seperti itu ketika lebih baik untuk mengeksekusi bagian dari permintaan yang kompleks secara terpisah, tetapi postgres tidak memahami ini sendiri. Kemudian kami mengambil bagian ini dalam subquery CTE.
Secara umum, situasinya berbeda, itulah sebabnya Postgres 12 membuat komit menambahkan kata kunci MATERIALIZED
dan NOT MATERIALIZED
, yang mengindikasikan apakah masing-masing akan memunculkan kueri atau inline.
Selain itu, perilaku default telah berubah. Sekarang subquery CTE akan sebaris secara default jika hasilnya digunakan sekali. Kalau tidak, itu akan terwujud seperti sebelumnya.