Внутреннее объединение на столах с записями 50M и 30K - PullRequest
1 голос
/ 16 мая 2019

У меня есть две таблицы A и B. A содержит 50 миллионов записей, а B содержит только 30 тысяч. Я создал индексы по умолчанию (B-дерево) для столбцов, используемых для объединения таблиц. Поле соединения имеет тип character varying.

Я запрашиваю базу данных этим запросом:

SELECT count(*)
from B INNER JOIN A
   ON B.id = A.id;

Время выполнения вышеупомянутого запроса составляет приблизительно 8 секунд. Когда я увидел план выполнения, планировщик применяет последовательное сканирование к таблице A, сканируя все 50 миллионов записей (это занимает большую часть времени) и сканирование индекса по таблице B.

Как я могу ускорить запрос?

1 Ответ

0 голосов
/ 16 мая 2019

Вы не можете ускорить этот запрос, если хотите получить точный результат.

Наиболее эффективной стратегией объединения, вероятно, будет соединение с использованием хеша или слияния, в зависимости от настроек work_mem.

Вы можете получить некоторое улучшение скорости при сканировании только по индексу;попробуйте VACUUM обе таблицы перед запросом.

Единственный способ настройки заключается в том, чтобы убедиться, что обе таблицы кэшируются в ОЗУ.

Существуют способы получения оценочных значений, см. мой блог для деталей.

...