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

From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: Вложенные SELECT и GROUP BY
Date: 2011-12-09 18:52:27
Message-ID: 20111209185226.GA6116@apache.rbscorp.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537

In response to

Browse pgsql-ru-general by date

  From Date Subject
Next Message Dmitry E. Oboukhov 2011-12-13 10:52:17 Re: Вложенные SELECT и GROUP BY
Previous Message Kirill Simonov 2011-12-09 18:17:08 Re: Вложенные SELECT и GROUP BY