
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
05.03.2015, 12:30
|
|||
|---|---|---|---|
Оптимизация GroupAggregate, фильтр, много записей. |
|||
|
#18+
Доброго времени! Коллеги, помогите оптимизировать простейший запрос. Есть таблица с одной колонкой, на ней висит индекс. Такой запрос: Код: plsql 1. работает на ура, используется индекс. Но вот при накладывании условия Код: plsql 1. которое в результате выдает бОльшинство записей, при подсчете count индекс (наверное логично) перестает использоваться, и подсчет в общем длится долго. Строк от 500тыс до 10 млн, work_mem выставлял 4GB. Подскажите как можно добиться ускорения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.03.2015, 12:46
|
|||
|---|---|---|---|
Оптимизация GroupAggregate, фильтр, много записей. |
|||
|
#18+
Поправка, во втором запросе индекс конечно тоже используется. Имел в виду что информация о количествах значений в индексе (в связи у утратой актуальности из-за фильтра) не используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.03.2015, 13:52
|
|||
|---|---|---|---|
|
|||
Оптимизация GroupAggregate, фильтр, много записей. |
|||
|
#18+
покажите EXPLAIN (analyze, buffers) SELECT ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.03.2015, 14:11
|
|||
|---|---|---|---|
Оптимизация GroupAggregate, фильтр, много записей. |
|||
|
#18+
LeXa NalBat, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Это много потому что таких колонок может быть до 1000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.03.2015, 14:33
|
|||
|---|---|---|---|
|
|||
Оптимизация GroupAggregate, фильтр, много записей. |
|||
|
#18+
sherzod_LeXa NalBat, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Это много потому что таких колонок может быть до 1000. В индексе нет "информация о количествах значений" и никогда не было. Select count(*) всегда будет линейно замедлятся от того сколько строк надо подсчитать... index only scan там или не index only scan. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.03.2015, 14:47
|
|||
|---|---|---|---|
Оптимизация GroupAggregate, фильтр, много записей. |
|||
|
#18+
Maxim Boguk, Да сейчас внимательно все просмотрев, я понял, что сделал ошибочный вывод. И в целом неверно сформулировал проблему. Под "информацией о кол-ве значений" я имел в виду, что ПГ может подсчитать значения не поднимаю саму таблицу в память, а используя только индекс. Проблема как оказалось в другом. Не буду плодить темы, и опишу ее здесь: Есть простая таблица с большим кол-вом колонок. Рассмотрим 2 sex и age. Запрос вида Код: sql 1. использует индекс. А вот такой нет (группировка по отличному от фильтра полю): Код: sql 1. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Индекс по двум полям построить не получится потому, что полей очень много и всевозможных их сочетаний не предусмотреть. Как можно оптимизировать подобные запросы (фильтры по разным полям, группировка по одному)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.03.2015, 16:01
|
|||
|---|---|---|---|
|
|||
Оптимизация GroupAggregate, фильтр, много записей. |
|||
|
#18+
sherzod_, Никак. Всеравно на большой таблице такие вещи будут неприемлемо медленные что с IOS что без него. Таки вещи предпросчитывают периодически и показывают исходя из предпросчитанных значений. PS: смысла в таких запросах нет в 99% случаев. Тем более в online не устаревшей информации такого рода. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.03.2015, 16:03
|
|||
|---|---|---|---|
Оптимизация GroupAggregate, фильтр, много записей. |
|||
|
#18+
sherzod_Maxim Boguk, Да сейчас внимательно все просмотрев, я понял, что сделал ошибочный вывод. И в целом неверно сформулировал проблему. Под "информацией о кол-ве значений" я имел в виду, что ПГ может подсчитать значения не поднимаю саму таблицу в память, а используя только индекс. Проблема как оказалось в другом. Не буду плодить темы, и опишу ее здесь: Есть простая таблица с большим кол-вом колонок. Рассмотрим 2 sex и age. Запрос вида Код: sql 1. использует индекс. А вот такой нет (группировка по отличному от фильтра полю): Код: sql 1. Индекс по двум полям построить не получится потому, что полей очень много и всевозможных их сочетаний не предусмотреть. Как можно оптимизировать подобные запросы (фильтры по разным полям, группировка по одному)? Второй запрос и не должен использовать индекс , так как там потенциально 50% данных выбирается, без индекса будет быстрее. На счот твоей "фундаментальной" проблемы могу предложить пару вариантов: - табличка с множеством одноколоночных индексов. Postgres сам решит какой индекс лудше. (собирайте статистику :-) ) тут каждый запрос будет вычисляться так быстро как может база одним тредом/ЦПУ. - elasticsearch может делать что то подобное и парралельно. запросы будут также вычисляться но уже паралельно на нескольких цпу/серверах. - сделать полное "преагрегирование" твоих данных, по этой теме ищи в инете начиная с "OLAP" и заканчивая hadoop. Тут запросы не считаются, а просто ищутся уже раннее прощитаные ответы и отдаются. Как правило за пару сотых/тысячных секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.03.2015, 17:49
|
|||
|---|---|---|---|
Оптимизация GroupAggregate, фильтр, много записей. |
|||
|
#18+
KRED, Maxim Boguk Спасибо за ответы. Предрасчитать не получится, так как всевозможных множеств записей 2^10млн. Соответственно OLAP тут тоже не поможет. Hadoop не для операционных запросов, с него как раз сейчас слезаем именно по таким типам запросов. Postgres тащит, а для масштабирования - Postgres-XL. Да сейчас именно так и делается, на каждую колонку индекс. Результаты приемлимые, просто думал, будут лучше, если ПГ будет считать count по индексу, не сканируя таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=53&mobile=1&tid=1998135]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 214ms |
| total: | 391ms |

| 0 / 0 |
