Re: Вложенные SELECT и GROUP BY

Поиск
Список
Период
Сортировка
От Dmitry E. Oboukhov
Тема Re: Вложенные SELECT и GROUP BY
Дата
Msg-id 20111209185226.GA6116@apache.rbscorp.ru
обсуждение исходный текст
Ответ на Re: Вложенные SELECT и GROUP BY  (Kirill Simonov <xi@resolvent.net>)
Список pgsql-ru-general
>> никак не привыкну к постгрисовым GROUP BY
>>
>> есть выборка:
>>
>> SELECT
>>     "t1".*,
>>     array_agg(t2.id) AS "t2_ids"
>> FROM
>>     "t1"
>> LEFT JOIN "t2" ON "t2"."t1_id" = "t1"."id"
>>
>> GROUP BY
>>     "t1"."id"
>>
>> LIMIT
>>     100
>> OFFSET
>>     100
>>

> Можно спрятать ARRAY_AGG во вложенный SELECT, тогда проблемы не будет:

> SELECT t1.*, COALESCE(t2.ids, '{}')
> FROM t1
> LEFT JOIN (SELECT t2.t1_id, ARRAY_AGG(t2.id) AS ids
> FROM t2 GROUP BY 1) AS t2 ON (t1.id = t2.t1_id)
> LIMIT 100
> OFFSET 100



а на самом деле задача растет из следующей

допустим имеем несколько таблиц

t1 t2 t3

допустим t3 имеет связь много к одному к t1
а t2 имеет связь 1 к 1 к t1

и надо сделать выборку, обычную страничную вида

t1.col1, t2.col2, array_agg(t3.col3)

табличка вида например

пользователь - имя группы - список прав что он имеет

ну или другой пример придумать.

ну и вот если мы показываем такую выборку постранично

SELECT
    ...
FROM
    t1
LEFT JOIN t2 ON ..
LEFT JOIN t3 ON ..
GROUP BY t1.id
ORDER BY t1.colN

LIMIT X
OFFSET Y

с определенного размера начинает план запроса быть ужасным. и
получается что дешевле выбрать сперва X элементов из таблицы t1, со
смещением Y а уже потом JOIN'ы делать на таблицы t2 и t3. при этом
LIMIT + ORDERBY въезжает во внутренний запрос, ORDERBY остается еще и
во внешнем и общий запрос выполняется в десятки раз быстрее. с MySQL
мы использовали этот прием. тут наткнулся на то что просмотрщик логов
которые хранятся в БД выполняется очень долго - поглядел на план -
надо убрать JOIN на таблицу пользователей которые к логам привязаны и
на таблицу названий уровней. попытался так сделать - упирается в то
что после вноса в вложенный запрос проблемы с GROUP BY.

то есть по сути организуем МАЛЕНЬКУЮ выборку и к ней приджойниваем еще
кучу столбиков из разных таблиц. но вот если тут нужен GROUP BY то
что-то у меня не получается
--

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Вложения

В списке pgsql-ru-general по дате отправления:

Предыдущее
От: Kirill Simonov
Дата:
Сообщение: Re: Вложенные SELECT и GROUP BY
Следующее
От: "Dmitry E. Oboukhov"
Дата:
Сообщение: Re: Вложенные SELECT и GROUP BY