PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana saya bisa mencegah Postgres membuat subquery?

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!).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL unnest() dengan nomor elemen

  2. simpan hasil postgresql dalam variabel bash

  3. Cara membuat urutan jika tidak ada

  4. Kembalikan daftar yang dikelompokkan dengan kemunculan menggunakan Rails dan PostgreSQL

  5. Gabung mandiri rekursif Postgresql