Jak jste zmínil, jediný způsob, jak skutečně vědět je porovnat prováděcí plány. Ve skutečnosti by nejlepším způsobem bylo použít EXPLAIN ANALYZE
, takže skutečně provede dotaz a vloží výsledky do výstupu s odhady, takže získáte představu o plánovači dotazů versus realitě.
Obecně bych však v takové situaci pravděpodobně udělal dočasnou tabulku pro podmnožinu klienta a poté JOIN
to do orders
stůl. Volitelně můžete použít WITH
místo toho udělat vše v jednom dotazu.
Takže něco jako:
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;
Tímto způsobem tmp_clients
obsahuje pouze klienty z New Yorku -- ~5000 řádků -- a je to tato tabulka, která bude připojena k tabulce objednávek.
Pro další optimalizaci můžete také vytvořit index v dočasné tabulce (na id klienta) a poté ANALYZE
před provedením JOIN
abyste zajistili, že JOIN bude proveden čistě na indexu. V každém případě byste měli zkontrolovat plány dotazů, abyste viděli relativní rozdíl (nebo to mějte na paměti, pokud JOIN
není tak rychlý, jak byste chtěli).
Odpověď na komentář od @poshest:
To zní jako dočasné tabulky se hromadí, což by zvýšilo nároky na paměť, a u dlouhotrvajícího připojení se funkce jeví jako únik paměti.
V takovém případě by to však nebyl skutečný únik, protože dočasné tabulky jsou zaměřeny na připojení. Automaticky zmizí, ale až po ukončení připojení. Můžete je však nechat zmizet hned, když s nimi skončíte. Jednoduše DROP
tabulku jako kteroukoli jinou, jakmile s nimi skončíte, a mám podezření, že budete moci volat funkci několikrát - na stejném připojení - bez stejného druhu monotónního nárůstu paměti.