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

Jelaskan JOIN vs. LEFT JOIN dan WHERE kondisi saran kinerja secara lebih rinci

Secara efektif, WHERE ketentuan dan JOIN ketentuan untuk [INNER] JOIN 100% setara di PostgreSQL. (Ini adalah praktik yang baik untuk menggunakan JOIN eksplisit> kondisi untuk membuat kueri lebih mudah dibaca dan dipelihara).

Hal yang sama adalah tidak benar untuk LEFT JOIN digabungkan dengan WHERE kondisi di atas meja di sebelah kanan gabungan. Tujuan dari LEFT JOIN adalah untuk mempertahankan semua baris di sisi kiri gabungan, terlepas dari kecocokan di sisi kanan. Jika tidak ditemukan kecocokan, baris diperpanjang dengan NULL nilai untuk kolom di sisi kanan. Panduan:

LEFT OUTER JOIN

Pertama, inner join dilakukan. Kemudian, untuk setiap baris di T1 yang tidak memenuhi kondisi bergabung dengan baris mana pun di T2, baris yang digabungkan ditambahkan dengan nilai nol di kolom T2. Jadi, tabel yang digabungkan selalu memiliki setidaknya satu baris untuk setiap baris di T1.

Jika Anda kemudian menerapkan WHERE kondisi yang membutuhkan sesuatu selain NULL nilai pada kolom tabel di sisi kanan, Anda membatalkan efek dan secara paksa mengubah LEFT [OUTER] JOIN untuk bekerja seperti [INNER] JOIN biasa , hanya (mungkin) lebih mahal karena rencana kueri yang lebih rumit.

Dalam kueri dengan banyak tabel yang digabungkan, Postgres (atau RDBMS apa pun) sulit untuk menemukan rencana kueri terbaik (atau bahkan bagus). Jumlah urutan yang mungkin secara teoritis untuk bergabung dengan tabel bertambah secara faktorial (!). Postgres menggunakan "Pengoptimal Kueri Umum" untuk tugas tersebut dan ada beberapa setelan untuk memengaruhinya.

Mengaburkan kueri dengan LEFT JOIN yang menyesatkan sebagaimana diuraikan, membuat pekerjaan perencana kueri lebih sulit, menyesatkan pembaca manusia dan biasanya mengisyaratkan kesalahan dalam logika kueri.

Jawaban terkait untuk masalah yang berasal dari ini:

  • Mengapa null sama dengan bilangan bulat di WHERE?
  • Kueri dengan LEFT JOIN tidak mengembalikan baris untuk hitungan 0
  • Kueri SQL menggunakan gabungan luar dan membatasi catatan anak untuk setiap induk
  • Gabungan luar kiri bertindak seperti gabung dalam
  • Pilih baris yang tidak ada di tabel lain

dll.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mengonfigurasi AppArmor untuk PostgreSQL dan TimescaleDB

  2. Psycopg2, Postgresql, Python:Cara tercepat untuk menyisipkan secara massal

  3. Kembali sebagai array objek JSON di SQL (Postgres)

  4. Bagaimana cara mengimpor data file CSV ke tabel PostgreSQL?

  5. Pembaruan ke bidang JSON tidak bertahan ke DB