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.