Kebingungan seputar LEFT JOIN
dan WHERE
klausa telah diklarifikasi berkali-kali:
pertanyaan menarik This ini tersisa:
Tidak ada petunjuk kueri eksplisit di Postgres. (Yang merupakan masalah perdebatan yang sedang berlangsung.) Tapi masih ada berbagai trik untuk membuat Postgres menekuk jalan Anda.
Tapi pertama-tama, tanyakan pada diri sendiri: Mengapa perencana kueri memperkirakan paket yang dipilih lebih murah untuk memulai? Apakah konfigurasi server Anda pada dasarnya waras? Pengaturan biaya memadai? autovacuum
berlari? Versi Postgres kedaluwarsa? Apakah Anda mengatasi masalah mendasar yang harus benar-benar diperbaiki?
Jika Anda memaksa Postgres untuk melakukannya dengan cara Anda sendiri, Anda harus yakin bahwa Postgres tidak akan aktif kembali, setelah peningkatan versi atau pembaruan ke konfigurasi server ... Sebaiknya Anda tahu persis apa yang Anda lakukan.
Yang mengatakan, Anda bisa paksa Postgres untuk "memfilter beberapa catatan sebelum melakukan JOIN
" dengan subquery tempat Anda menambahkan OFFSET 0
- yang hanya noise, secara logis, tetapi mencegah Postgres mengatur ulang menjadi bentuk gabungan biasa. (Bagaimanapun juga, petunjuk kueri)
SELECT la.listing_id, la.id, lar.*
FROM (
SELECT listing_id, id
FROM la
WHERE listing_id = 2780
OFFSET 0
) la
LEFT JOIN lar ON lar.application_id = la.id;
Atau Anda dapat menggunakan CTE (kurang jelas, tetapi lebih mahal). Atau trik lain seperti mengatur parameter konfigurasi tertentu. Atau, dalam kasus khusus ini, Saya akan menggunakan LATERAL
bergabung dengan efek yang sama:
SELECT la.listing_id, la.id, lar.*
FROM la
LEFT JOIN LATERAL (
SELECT *
FROM lar
WHERE application_id = la.id
) lar ON true
WHERE la.listing_id = 2780;
Terkait:
Berikut adalah blog ekstensif tentang petunjuk Kueri oleh 2ndQuadrant. Berusia lima tahun tetapi masih berlaku.