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

Mengapa kueri paling alami (yaitu menggunakan INNER JOIN (bukan LEFT JOIN)) sangat lambat

(seperti yang diarahkan, saya memasukkan sebagian dari komentar saya sebagai jawaban karena itu memecahkan masalah)

Ubah ekspresi EXISTS menjadi ekspresi IN.

Ini berfungsi lebih baik dalam contoh ini karena kueri sekarang akan dievaluasi secara efektif dari "dalam ke luar" dimulai dengan kueri yang berisi faktor paling membatasi Anda:pencarian pencarian teks lengkap. Kueri itu akan mengembalikan sekumpulan kecil baris yang dapat dicari langsung terhadap kunci utama kueri luar (WHERE x in (SELECT X...)) sebagai lawan memanggil kueri "dalam" sekali per nilai kueri luar (atau untuk semua nilai dalam kasus asli Anda, jika saya membacanya dengan benar). Metode EXISTS di sini menghasilkan Nested Loops (satu evaluasi dari satu kueri untuk setiap nilai di nilai lainnya) vs metode IN menggunakan Hash Joins (metode eksekusi yang jauh lebih efisien dalam banyak kasus, jika bukan sebagian besar.

Perhatikan bahwa dengan metode EXISTS, ada empat Loop Bersarang yang dieksekusi dengan masing-masing dijalankan setidaknya 3.000 kali. Biaya itu bertambah. Meskipun ini bukan perbandingan langsung, Anda dapat memperlakukan Nested Loops seperti yang Anda lakukan untuk loop FOR dalam kode aplikasi:setiap kali Anda memanggil loop dalam, perkiraan big-O Anda naik urutan besarnya:O(n) ke O(n^ 2) ke O(n^3), dll.

Hash Join lebih seperti peta, di mana dua array dilewati pada saat yang sama dan operasi dilakukan pada keduanya. Ini kira-kira linier (O(n)). Anggap ini bersarang sebagai aditif sehingga akan menjadi O(n) ke O(2n) ke O(3n), dll.

Ya, ya, saya tahu itu bukan hal yang sama, tapi intinya adalah memiliki beberapa loop bersarang biasanya menunjukkan rencana kueri yang lambat dan membandingkan dua gaya big-O membuatnya lebih mudah dikenali, saya yakin.

Loop Bersarang dan EXISTS tidak jahat, pada dasarnya, tetapi untuk sebagian besar kasus di mana ada kondisi filter dasar yang pada akhirnya memengaruhi segalanya (misalnya, pencarian teks lengkap dalam pertanyaan), ekspresi IN (atau, dalam beberapa kasus, GABUNG yang tepat) menghasilkan rencana yang jauh lebih efisien.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menemukan posting yang ditandai dengan lebih dari satu tag di Rails dan Postgresql

  2. Menghitung jarak antara lokasi gps dan nilai geografi postgis menggunakan fungsi?

  3. PostgreSql :Json Array ke Baris menggunakan Lateral Join

  4. Cara mengurai JSON di postgresql

  5. Cara membuat grup dengan ukuran yang merata