sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:nejlepší způsob, jak spojit malé podmnožiny velkých tabulek

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.



  1. Jak vytvořit jedinečné omezení ve sloupci pro již existující tabulku - SQL Server / Výukový program TSQL, část 97

  2. Jak mohu zahrnout čáry přerušení do záznamů mysql?

  3. Doctrine 2 mysql FIELD funkce v pořadí podle

  4. jak vložit datetime do mysql pomocí php