Както споменахте, единственият начин за наистина знаете е да сравните плановете за изпълнение. Всъщност най-добрият начин би бил да използвате EXPLAIN ANALYZE
, така че действително да изпълни заявката и да вмъкне резултатите в изхода с прогнозите, така че да можете да добиете представа за планирането на заявки спрямо реалността.
Но като цяло това, което бих направил в ситуация като тази, вероятно би било да създам временна таблица за клиентско подмножество и след това JOIN
това към orders
маса. По желание можете да използвате WITH
вместо да направите всичко в една заявка.
И така, нещо като:
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;
По този начин, tmp_clients
съдържа само клиентите от Ню Йорк -- ~5K реда -- и тази таблица ще бъде присъединена към таблицата с поръчки.
Можете също така, за да оптимизирате допълнително, да създадете индекс на временната таблица (на clientid) и след това да ANALYZE
преди да направите JOIN
за да се гарантира, че JOIN се извършва само върху индекса. Бихте искали да проверите плановете за заявки във всеки случай, за да видите относителната разлика (или просто имайте това предвид, ако JOIN
не е толкова бързо, колкото бихте искали).
Отговор на коментар от @poshest:
Това звучи като временните таблици се натрупват, което би увеличило отпечатъка на паметта, а за дълготрайна връзка функционалността изглежда е изтичане на памет.
В такъв случай обаче не би било истинско изтичане, тъй като временните таблици са обхванати от връзка. Те изчезват автоматично, но чак след края на връзката. Можете обаче да ги накарате да изчезнат веднага, когато приключите с тях. Просто DROP
таблицата, както бихте направили с всяка друга, след като приключите с тях, и подозирам, че ще можете да извикате функцията много пъти -- на една и съща връзка -- без същия вид монотонно увеличаване на паметта.