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

Perbedaan kinerja:kondisi ditempatkan pada klausa INNER JOIN vs WHERE

Alasan Anda melihat perbedaan adalah karena rencana eksekusi yang disusun oleh perencana, ini jelas berbeda tergantung pada kueri (bisa dibilang, itu harus mengoptimalkan 2 kueri agar sama dan ini mungkin bug ). Ini berarti bahwa perencana berpikir bahwa ia harus bekerja dengan cara tertentu untuk mendapatkan hasil di setiap pernyataan.

Ketika Anda melakukannya dalam GABUNG, perencana mungkin harus memilih dari tabel, memfilter berdasarkan bagian "Benar", lalu bergabung dengan kumpulan hasil. Saya akan membayangkan ini adalah tabel besar, dan karena itu banyak data yang harus dilihat, dan tidak dapat menggunakan indeks secara efisien.

Saya menduga bahwa jika Anda melakukannya dalam klausa WHERE, perencana memilih rute yang lebih efisien (mis., berbasis indeks, atau kumpulan data yang difilter sebelumnya).

Anda mungkin dapat membuat penggabungan bekerja secepat (jika tidak lebih cepat) dengan menambahkan indeks pada dua kolom (tidak yakin apakah kolom yang disertakan dan indeks beberapa kolom didukung di Postgres).

Singkatnya, perencana masalahnya adalah memilih 2 rute yang berbeda untuk mendapatkan set hasil, dan salah satunya tidak seefisien yang lain. Tidak mungkin bagi kita untuk mengetahui apa alasannya tanpa informasi tabel lengkap dan informasi MENJELASKAN ANALISIS.

Jika Anda ingin mengetahui secara spesifik mengapa kueri spesifik Anda melakukan ini, Anda harus memberikan lebih banyak informasi. Namun alasannya adalah perencana memilih rute yang berbeda.

Bahan Bacaan Tambahan:

http://www.postgresql.org/docs/current/static/explicit-joins.html

Hanya skim, tampaknya perencana postgres tidak memesan ulang gabungan untuk mengoptimalkannya. coba ubah urutan gabungan dalam pernyataan Anda untuk melihat apakah Anda kemudian mendapatkan kinerja yang sama... hanya sebuah pemikiran.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Persimpangan beberapa array di PostgreSQL

  2. Menyebarkan PostgreSQL pada Wadah Docker

  3. Setel string kosong ('') ke NULL di seluruh database

  4. Pilih jumlah baris di tabel lain dalam pernyataan SELECT Postgres

  5. dapatkan tabel GABUNG sebagai array hasil dengan PostgreSQL/NodeJS