Apakah perilaku pagar optimasi CTE (WITH query) ditentukan dalam standar SQL: 2008? Jika ya, dimana?


23

Saya sering melihat referensi ke WITHkueri (ekspresi tabel umum, atau CTE) yang bertindak sebagai pagar optimasi, di mana server tidak diizinkan untuk mendorong filter ke dalam kueri CTE, menarik ekspresi umum keluar dari CTE, dll. Sering diklaim menjadi perilaku yang diperlukan oleh standar SQL.

CTE jelas merupakan pagar pengoptimalan di PostgreSQL ... tetapi apakah ini diperlukan oleh standar, atau sebenarnya hanya detail implementasi?

Misalnya, milis ini memposting klaim atau menyarankan bahwa itu standar:

Setelah menyebutkannya dalam komentar saya ditanya di mana itu ditentukan - dan setelah melihat satu-satunya rancangan SQL: 2008 saya memiliki akses ke Saya tidak memiliki banyak keberuntungan menemukannya.

Saya belum secara intensif mempelajari standar, jadi saya berharap untuk saran dari seseorang yang memiliki: Apakah pagar pengoptimalan CTE di PostgreSQL sebenarnya diperlukan oleh standar? Dan jika demikian, di mana itu ditentukan? Atau apakah pernyataan pada milis Pg salah?

Lihat juga pagar pengoptimalan CTE utas pada daftar agenda? .

Jawaban:


10

Saya pikir ini adalah detail implementasi.

Implementasi yang sesuai tidak diperlukan untuk melakukan urutan tindakan yang didefinisikan dalam Aturan Umum, asalkan pengaruhnya terhadap SQL-data dan skema, pada parameter host dan variabel host, dan pada parameter SQL dan variabel SQL identik dengan efek yang urutan. Istilah ini secara efektif digunakan untuk menekankan tindakan yang pengaruhnya dapat dicapai dengan cara lain melalui suatu implementasi. 1

Saya pikir seorang pelaksana dapat mengevaluasi ekspresi tabel umum 20 kali, bahkan dalam 20 cara yang berbeda, dan masih memiliki implementasi yang sesuai. Satu-satunya masalah yang relevan adalah apakah "efeknya ... identik dengan efek" dari urutan tindakan yang ditentukan dalam aturan Umum.

[1]. Bagian 6.3.3.3, "Urutan evaluasi aturan", dalam konsep standar SQL 2008, memiliki nama file lokal 5CD2-01-Framework-2006-01.pdf, hal. 41 Saya tidak tahu dari mana saya mendapatkannya. Google mungkin tahu.


2
Itu masuk akal - dan karena PostgreSQL akan memungkinkan penggunaan fungsi dengan efek samping atau pernyataan pengubah data dalam CTE, ia harus memagari CTE tersebut. Saya kira itu berarti itu akan bebas untuk CTE sebaris yang hanya memanggil STABLEatau IMMUTABLEfungsi.
Craig Ringer

Saya pikir CTEs ditulis yang tidak belum dalam standar SQL, tapi aku tidak positif.
Mike Sherrill 'Cat Recall'

wCTE tentu saja merupakan ekstensi PostgreSQL. Itu kurang jelas jika fungsi yang menjalankan DML adalah, karena fungsi yang ditentukan pengguna dalam SQL adalah SQL/PSMyang tidak didukung Pg sama sekali ...
Craig Ringer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.