Saya pikir OFFSET 0
adalah pendekatan yang lebih baik karena ini lebih jelas merupakan peretasan yang menunjukkan bahwa sesuatu yang aneh sedang terjadi, dan kecil kemungkinan kami akan mengubah perilaku pengoptimal di sekitar OFFSET 0
... padahal semoga CTE akan menjadi inlineable di beberapa titik CTE menjadi inlineable secara default di PostgreSQL 12. Penjelasan berikut ini untuk kelengkapan; gunakan jawaban Seamus.
Untuk subkueri yang tidak berkorelasi, Anda bisa mengeksploitasi penolakan PostgreSQL 11 dan yang lebih lama untuk memasukkan WITH
istilah kueri untuk menyusun ulang kueri Anda sebagai:
WITH t AS (
SELECT * FROM tbl WHERE id IN ('6d48fc431d21', 'd9e659e756ad')
)
SELECT COUNT(*)
FROM t
WHERE data ? 'building_floorspace'
AND data ?| ARRAY['elec_mean_monthly_use', 'gas_mean_monthly_use'];
Ini memiliki efek yang hampir sama dengan OFFSET 0
retas, dan sukai offset 0
hack mengeksploitasi keanehan dalam pengoptimal Pg yang digunakan orang untuk mengatasi kekurangan petunjuk kueri Pg ... dengan menggunakannya sebagai petunjuk kueri.
Tapi OFFSET 0
hack agak resmi diberkati, sedangkan penyalahgunaan CTE tidak berfungsi lagi di PostgreSQL 12. (Yay!).