PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak mogę uniemożliwić Postgresowi wstawianie podzapytania?

Myślę, że OFFSET 0 jest lepszym podejściem, ponieważ jest to bardziej oczywisty hack pokazujący, że dzieje się coś dziwnego i jest mało prawdopodobne, abyśmy kiedykolwiek zmienili zachowanie optymalizatora wokół OFFSET 0 ... podczas gdy miejmy nadzieję, że CTE w pewnym momencie staną się nieliniowe CTE stały się domyślnie inlineable w PostgreSQL 12. Poniższe wyjaśnienie ma na celu zapewnienie kompletności; skorzystaj z odpowiedzi Seamusa.

W przypadku nieskorelowanych podzapytań możesz wykorzystać odmowę PostgreSQL 11 i starszych do inline WITH terminy zapytania, aby przeformułować zapytanie jako:

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'];

Ma to taki sam efekt jak OFFSET 0 hack i jak offset 0 hack wykorzystuje dziwactwa w optymalizatorze Pg, których ludzie używają do obejścia braku podpowiedzi do Pg... używając ich jako podpowiedzi do zapytań.

Ale OFFSET 0 hack jest nieco oficjalnie błogosławiony, podczas gdy nadużywanie CTE nie działa już w 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. Sterownik JDBC PostgreSQL z systemem Android

  2. Zakończ zawieszone zapytanie (bezczynne w transakcji)

  3. Jak usunąć wiele tabel w PostgreSQL za pomocą symbolu wieloznacznego?

  4. Jak korzystać ze schematów w Django?

  5. Zarządzanie wysoką dostępnością w PostgreSQL – Część III:Patroni