Задать вопрос
m0dE
@m0dE

Почему выборка по Primary Key очень долгая?

Добрый день! Таблица партицированна по месяцам. В одной из таблиц около 1м записей. Почему выборка занимает около 150мс, если делать запрос
//150ms (апрельская таблица)
SELECT * FROM table_2016_04 WHERE "id"=110033;
//301ms (родительская таблица, для примера)
SELECT * FROM table WHERE "id"=110033;
Что можно сделать, чтобы ускорить выборку из партицированной таблицы? В настройках постгреса стоит логирование долгих запросов, превышающих 100мс (какое оптимальное значение должно стоять?). сервер оч нагружен.

EXPLAIN ANALYZE SELECT * FROM table_2016_04 WHERE "id"=110033;


Seq Scan on table_2016_04 (cost=0.00..65752.74 rows=1 width=3122) (actual time=121.602..167.554 rows=1 loops=1)
Filter: (id = 110033)
Rows Removed by Filter: 732260
Planning time: 0.652 ms
Execution time: 167.631 ms


Спасибо! Очень надеюсь на помощь!
  • Вопрос задан
  • 422 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
zoroda
@zoroda
Необычный Fullstack
Чтобы PostgreSQL при выборке не перебирал все партиции, нужно:
1. Cоздать CHECK constraint на каждой партиции. Пример:
ALTER TABLE table_2016_04 ADD CONSTRAINT c_table_2016_04
   CHECK ( my_date >= '20160401'::date  and  my_date <= '20160430'::date );

2. В запросе на выборку указать условие, позволяющее выбрать нужные партиции по условию, указанному в CHECK constraint:
SELECT * FROM table WHERE my_date >= '20160401'::date  and  my_date <= '20160430'::date and "id"=110033

3. Возможно, выборку ещё ускорит индекс на table_2016_04 по полю id.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы