управление планом исплнения запроса

grigori

( ͡° ͜ʖ ͡°)
Команда форума
управление планом исполнения запроса

Привет, SadSpirit - объективно понимаю, что отвечать будешь ты :)

Не подскажешь ли вот о чем:
Есть партицированная таблица campaigns_recepients с кучей дочерних, вроде
campaigns_recepients_100 (CONSTRAINT cr100check CHECK (campaign_id = 100)) INHERITS (campaigns_recepients),
остальные таблицы обычные.

делаю запрос
Код:
 SELECT s.sender_id, count(s.capacity)
   FROM senders s
   LEFT JOIN campaigns_recepients cr ON cr.sender_id = s.sender_id
   LEFT JOIN campaigns c on c.campaign_id=cr.campaign_id
  WHERE s.status = 'active'::senders_statuses
   AND c.status='running' group by s.sender_id
подтаблиц campaigns_recepients много, а campaigns where status='running' - одна-две
смотрю Explain: сначала подключаются все 100 дочерних таблиц, а потом из этой кучи фильтруются данные.

Если сделать через под-запрос
AND cr.campaign_id in (select campaign_id from campaigns where status='running'::campaigns_statuses)
все то же самое.

А вот если сделать
Код:
 SELECT s.sender_id, s.capacity
   FROM senders s
   LEFT JOIN campaigns_recepients cr ON cr.sender_id = s.sender_id
  WHERE s.status = 'active'::senders_statuses
   AND c.status='running'
   AND cr.campaign_id in (101,102,105)
запрос замечательно оптимизируется и подключаются только 3 нужные подтаблицы.

Не знаешь, нельзя его заставить выполнять запрос в нужном мне порядке, или надо разбить на 2 и писать константы?
 

dr-sm

Новичок
если попробовать через CTE вынести campaigns_recepients иннер как я понимаю джоин campaigns where status='running' и потом уж лефтджойнить с сендерс?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
пробовал, конечно - анализатор условия из join переносит в where

если перечисляю константами in (101,102,105) - оптимизатор работает,
если один запрос с условием - сначала идет append всех дочерних таблиц
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: grigori
Привет, SadSpirit - объективно понимаю, что отвечать будешь ты :)
На самом деле, с такими вопросами лучше в списки рассылки, там люди в отличие от меня исходники читают...

Вполне возможно, что constraint exclusion просто не понимает ничего сложнее констант.

Ну и вопрос: если часто делаются запросы с status='active', то, может, и разбивать по этому критерию?
 

~WR~

Новичок
Вполне возможно, что constraint exclusion просто не понимает ничего сложнее констант.
Вроде так и есть. Видел несколько вопросов на эту тему.
Понимает константы и, кажется, IMMUTABLE функции.
 
Сверху