PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL:най-добрият начин за свързване на малки подгрупи от големи таблици

Както споменахте, единственият начин за наистина знаете е да сравните плановете за изпълнение. Всъщност най-добрият начин би бил да използвате 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 таблицата, както бихте направили с всяка друга, след като приключите с тях, и подозирам, че ще можете да извикате функцията много пъти -- на една и съща връзка -- без същия вид монотонно увеличаване на паметта.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Делението на цели числа връща 0

  2. Postgres функционира много по-бавно, когато използва входни променливи

  3. psycopg2 cursor.execute() с параметър на SQL заявка причинява синтактична грешка

  4. PostgreSQL динамичен достъп до таблици

  5. Актуализирайте множество редове в таблица от друга таблица, когато съществува условие