Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
Есть таблица svalue. В ней три поля id, value, time Делаю запрос select id, max(time) as mtime from svalue group by id; Все выводится нормально, групируется по id и в каждой строчке максимальное значение time для этого поля. Но мне нужно еще и какое значение value было в это время, делаю запрос select id, value, max(time) as mtime from svalue group by id; на что psql сообщает ERROR: column "svalue.value" must appear in the GROUP BY clause or be used in an aggregate function если вставляю value в group by получается полная несгруппированная ерудна :-( Как же получить значения value по максимальному времени сгруппированые по id? Да, psql 7.4.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 06:58 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 07:28 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
To PJG, не-е, что-то тут не так. Похоже на бесконечный цикл. На тестовой базе в 44000 записей не дождался ответа в течении 15 минут ;(, что уж говорить про боевую базу с 8-мя миллионами записей. IMHO, надо всетаки копать в сторону group by. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 08:32 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
я бы начал копать примерно отсюда: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 09:20 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
О! То что надо. Все замечательно работает. Огромное спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 09:51 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
Эх, не успел написать то же самое :) ну да ладно, в след. раз :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 11:07 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
nevermindЭх, не успел написать то же самое :) ну да ладно, в след. раз :))Зачем же в следующий раз, можно и сейчас проявить себя ;-). Агрегатная функция max() исполняется жутко долго ;(, в известном документе про оптимизацию работы PostgreSQL, рекомендуется ее заменить на select ... order by limit 1, но что-то ощутимого быстродействия мне это не принисло. Вроде как Order by использует сортировку, а не index scan. Хотя index по полю time есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 13:36 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
Напиши, что у тебя explain analyze выдает на запросе с order by ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 14:11 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
nevermindНапиши, что у тебя explain analyze выдает на запросе с order byЗапрос EXPLAIN analyze SELECT time from svalue order by time desc limit 1 Ответ Limit (cost=4310.15..4310.15 rows=1 width=8) (actual time=1143.622..1143.625 rows=1 loops=1) -> Sort (cost=4310.15..4419.05 rows=43561 width=8) (actual time=1143.611..1143.611 rows=1 loops=1) Sort Key: "time" -> Seq Scan on svalue (cost=0.00..953.61 rows=43561 width=8) (actual time=0.156..423.181 rows=50060 loops=1) Total runtime: 1161.689 ms (5 rows) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 14:24 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
Во е-мое, вот это на грабли я наступил! У меня был совмещенный индекс по двум полям сразу (id,time). Когда я создал раздельные индексы, тот же запрос с order by стал использовать индекс и выполниля за 0.2 msec ;-) Как бы теперь этот select с order by вместо max() вписать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 14:41 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
авторУ меня был совмещенный индекс по двум полям сразу (id,time). Когда я создал раздельные индексы, тот ... так все праильно. если бы был индекс (time,id), тогда бы он использовался при order by time. Индексы (обычных видов) не аддитивны. В т.ч. 2 отдельных индекса не заменяют составной при поиске по 2-м полям . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 15:15 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
Господа, тема не закрыта ;-) Пытаюсь заменить тормозной max() на вроде более шустрый select... order by и вот что у меня получается. Запрос EXPLAIN analyze SELECT v.id, ( SELECT s.time FROM svalue AS s WHERE s.id = v.id ORDER BY time DESC LIMIT 1) AS maxtime FROM svalue as v GROUP BY v.id Ответ HashAggregate (cost=1208.21..1216.82 rows=13 width=4) (actual time=564.285..662.280 rows=13 loops=1) -> Seq Scan on svalue v (cost=0.00..1070.17 rows=55217 width=4) (actual time=0.108..337.782 rows=55247 loops=1) SubPlan -> Limit (cost=0.00..0.66 rows=1 width=8) (actual time=9.813..9.815 rows=1 loops=13) -> Index Scan Backward using time_idx on svalue s (cost=0.00..2812.66 rows=4248 width=8) (actual time=9.800..9.800 rows=1 loops=13) Filter: (id = $0) Total runtime: 663.270 ms (7 rows) Видим, что в подзапросе (где вычисляется максимальное поле time) индекс используется, а при выбре id нет ;-(. Вот созданные индексы для данной таблицы psql=# \d svalue Table "public.svalue" Column | Type | Modifiers --------+-----------------------------+----------- id | integer | not null value | text | time | timestamp without time zone | alarm | smallint | Indexes: "alarm_idx" btree (alarm) "id_idx" btree (id) "id_time_idx" btree (id, "time") "time_id_idx" btree ("time", id) "time_idx" btree ("time") Как же можно ускорить запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2004, 08:27 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
Потому что запрос переписал неправильно и индексов у тебя туева хуча не понятно зачем. Оставь только те, которыми пользуешься - остальные грохни нафиг. Насчет запроса: тебе всего лишь надо было переписать внутр. часть того, что писал Sad spirit. Это будет что-то вроде Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. писал быстро, поэтому возможны ошибки. Проверяй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2004, 11:49 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
nevermindПотому что запрос переписал неправильно и индексов у тебя туева хуча не понятно зачем. Оставь только те, которыми пользуешься - остальные грохни нафиг.Конечно я специально насоздавал излишние индексы, чтобы посмотреть какими реально будет пользоваться оптимизатор, остальные удалю. nevermind Насчет запроса: тебе всего лишь надо было переписать внутр. часть того, что писал Sad spirit. Это будет что-то вродеКак ты предложил я тоже пробовал. На это psql выдает Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2004, 12:25 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
Хм-м-м. так что GROUP BY тоже не использует индексы ? Вот пример Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2004, 12:38 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
в лоб можно и так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. еще один, думается плохой, вариант Код: plaintext 1. 2. 3. 4. 5. 6. 7. чтобы считать тайм только один раз для группы (id) придется как-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2004, 13:51 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
assaв лоб можно и так ,но мне не кажется, что это будет быстро - условие Where будет проверяться построчно. Да, в лоб получилось очень долго. assa еще один, думается плохой, вариант 2-й вариант тоже очень долго. assaчтобы считать тайм только один раз для группы (id) придется как-то так: (т.е. :берем группировку по id, вместо max берем подзапрос, на результат - вяжемся). Будет ли это быстро?3-й вариант показал такую же скорость как и в приведенном мной варианте, хотя план запроса более навороченный. Вот анализ плана запроса Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2004, 14:52 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
если речь об этом: Код: plaintext 1. 2. 3. 4. 5. 6. 7.3.4 в PgAdmin Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2004, 16:02 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
тьфу atable.atext - энто вылезло у меня из определения svalue.id во вью "svalue" (не стал я таблу заводить для тестов), но, мне кааца также должно отругаться и на табличном наборе (если нет - это очередной баг постнре, на). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2004, 16:06 |
|
||
|
Как правильно применить GROUP BY
|
|||
|---|---|---|---|
|
#18+
действительно, запрос на таблице проходит. На вью - них. Баг работы со вью? (идеалогически-то ему (постгресу, т.е.) должно быть пох (Select one_field From bla-bla limit 1) as anyval - это попросту выражение, и никакой группировкой тут не пахнет, т.ч. должно пропускать и вью и таблицу в кач-ве bla-bla). Недосмотр тут у них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2004, 16:27 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=32677436&tid=2007691]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
557ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 892ms |

| 0 / 0 |
