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

PostgreSQL:cara terbaik untuk menggabungkan subset kecil dari tabel besar

Seperti yang Anda singgung, satu-satunya cara untuk benar-benar tahu adalah untuk membandingkan rencana eksekusi. Sebenarnya, cara terbaik adalah menggunakan EXPLAIN ANALYZE , sehingga benar-benar mengeksekusi kueri dan memasukkan hasilnya ke dalam output dengan perkiraan, sehingga Anda bisa memahami perencana kueri versus kenyataan.

Namun, secara umum, apa yang akan saya lakukan dalam situasi seperti ini mungkin adalah membuat tabel temp untuk subset klien dan kemudian JOIN itu ke orders meja. Anda dapat secara opsional menggunakan WITH alih-alih melakukan semuanya dalam satu kueri.

Jadi, sesuatu seperti:

CREATE TEMP TABLE tmp_clients AS
SELECT c.clientid
FROM clients c
WHERE c.city = 'New York'
ORDER BY c.clientid;

SELECT *
FROM orders AS o
JOIN tmp_clients AS c ON (o.clientid = c.clientid)
ORDER BY o.clientid;

Dengan cara ini, tmp_clients hanya berisi klien New York -- ~5 ribu baris -- dan tabel itulah yang akan digabungkan ke tabel pesanan.

Anda juga dapat, untuk mengoptimalkan lebih lanjut, membuat indeks pada tabel temp (pada clientid) dan kemudian ANALYZE sebelum melakukan JOIN untuk memastikan bahwa GABUNG dilakukan murni pada indeks. Anda ingin memeriksa rencana kueri dalam setiap kasus untuk melihat perbedaan relatif (atau ingatlah ini jika JOIN tidak secepat yang Anda inginkan).

Respons terhadap komentar dari @poshest:

Kedengarannya seperti tabel temp menumpuk, yang akan meningkatkan jejak memori, dan, untuk koneksi yang berjalan lama, fungsionalitas tampak seperti kebocoran memori.

Dalam hal ini, itu bukan kebocoran yang sebenarnya, karena tabel temp dicakup untuk koneksi. Mereka menghilang secara otomatis, tetapi tidak sampai setelah koneksi berakhir. Namun, Anda dapat langsung menghilangkannya setelah selesai menggunakannya. Cukup DROP tabel seperti yang Anda lakukan yang lain setelah Anda selesai dengan mereka, dan saya menduga Anda akan dapat memanggil fungsi beberapa kali -- pada koneksi yang sama -- tanpa peningkatan jejak memori monoton yang sama.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan IF-THEN-ELSE di postgresql

  2. Menerapkan batasan tanggal unik pada kolom TIMESTAMP di postgresql

  3. SQL - Buat tampilan dari beberapa tabel

  4. Cara mengembalikan nilai hasil kueri sisipkan menggunakan pembantu pg-promise

  5. PostgreSQL:Stempel waktu di masa mendatang