
Denis
01.05.2017
04:34:26
Да, только из подзапросов можно лимиты выкинуть

Just
01.05.2017
04:34:44
ок
индекс так создал
create index transactions_16_id_idx on transactions_16 (id);

Google

Denis
01.05.2017
04:43:01
Ну все, грустим, btree нам не подошёл. Можно ещё попробовать bloom

Just
01.05.2017
04:44:40

Denis
01.05.2017
04:46:58

Just
01.05.2017
04:47:57
тут правда говорили, что where column in (...) это очень плохо, но в тот раз на таком же запросе разницы между ними особой не было

Denis
01.05.2017
05:01:27

Just
01.05.2017
05:15:30
а почему все-таки выбрать 300 записей, по id'ам с 2.8 млн таблицы так долго или это нормально?

Denis
01.05.2017
05:16:12
А покажите размер таблицы.

Just
01.05.2017
05:21:51
кстати, странно, по идеи же transactions, как родительская, должна быть пустой

Denis
01.05.2017
05:23:58
Ну сделайте select count(*) from only transactions

Google

Just
01.05.2017
05:24:18
0

Denis
01.05.2017
05:26:57
Тогда все ок. Можно ещё через pageinspect посмотреть, что в индексе и таблице лежит на низком уровне, но я не могу придумать, что там могло бы быть не так
А просто по id = 42 как быстро ищет?

Just
01.05.2017
05:31:17
по существующему id еще проверю

Denis
01.05.2017
05:32:25
А у вас toast полей нет?

Just
01.05.2017
05:33:03
1.3-1.5 сек

Denis
01.05.2017
05:33:04
Это очень долго для поиска по первичному ключу в таблице на 2,8млн

Just
01.05.2017
05:33:37

Denis
01.05.2017
05:34:18
А select id from transactions where id =...

Just
01.05.2017
05:34:42
тоже самое, 1.6 сек
вообще я делаю sudo service postgresql stop && sync; echo 3 | sudo tee /proc/sys/vm/drop_caches && sudo service postgresql start каждый раз перед запросом, может это как это влияет на первый запрос негативно

Denis
01.05.2017
05:38:08
А, ну да, разумеется)
Постгрес же работает с кешем, а туда все надо поднять

Just
01.05.2017
05:39:44
с первым запросом поднимаются еще и системные вещи какие-то и даже возможно таблицы видимости и все такое для таблиц?
тогда надо делать какой-то инициализирующий запрос, но что бы он сами данные не кешировал

Denis
01.05.2017
05:42:50
В общие буферы поднимаются страницы с диска. Они могут быть страницами таблиц, индексов. Я так понимаю, что вначале нужно "прогреться", но вот как происходит их первоначальное заполнение страницами я не знаю((

Google

Just
01.05.2017
05:46:59
в общем, в итоге два пути, видимо: или использовать ssd или порезать таблицу по id на партиции тысяц по 100, а то и меньше, а id находить из сфинкса. или все-таки поиск по id не такой медленный, но это надо проверить еще

Denis
01.05.2017
05:48:06
Ну вот у меня тестовая таблица на 2 млн на ссд ищет по идентификатору милисекунды

Just
01.05.2017
05:49:03
а как вы удостоверяетесь, что это страницы с диска, а не с кеша?

Denis
01.05.2017
05:51:55

Just
01.05.2017
05:52:22

Denis
01.05.2017
05:58:42
нет, гарантированно я не могу вам сказать про сброс кешей. у меня все в непривилигированных lxc, я сбрасываю кеш в хостовой системе, но как это влияет на кеш контейнеров - не знаю но вот результаты.
из 2 млн 300 случайных строк вытаскиваются за 53 млс

Just
01.05.2017
06:01:49
то ли это заслуга ssd, может что-то с конфигами не так у меня

Denis
01.05.2017
06:02:09
Скорее ссд

Just
01.05.2017
06:02:19
т.е. разница в 500 раз
это конечно очень сильно
надо посмотреть, можно ли развернуть на одном аке ажура диск, а подключаться к нему с другого, а то у нас бизспарк, всего 150$ на одном аке

Just
01.05.2017
06:07:50
https://blog.2ndquadrant.com/tables-and-indexes-vs-hdd-and-ssd/
вот сравнение, на небольшой таблице разница в разы, но не в сотни раз.
а какая у вас структура таблицы? хочу такую же развернуть и потестить то же самое

Mikhail
01.05.2017
06:08:20

Denis
01.05.2017
06:09:52

Just
01.05.2017
06:10:12

Mikhail
01.05.2017
08:16:19

Denis
01.05.2017
08:17:32

Mikhail
01.05.2017
08:17:43
Может в сторону хранимых процедур посмотреть, сделать логику работы с курсором например

Google

Denis
01.05.2017
08:19:23
Ну тут все равно нужно отделять холодные данные, которых наверняка десятки/сотни гигабайт в сторону и работать только с тёплыми.

Mikhail
01.05.2017
08:21:03

Denis
01.05.2017
08:22:45

Mikhail
01.05.2017
08:44:21
Denis А все так, почему materialized view плохое решение? Ведь это та же самая таблица, проблема только в том, что её нужно полность сбрасывать. Вот я и буду раз в минуту её сбрасывать
и тогде я на ней создам индексы, которые собирался

Denis
01.05.2017
08:47:33
поэтому я и пытаюсь придумать что-то лучше, но не могу))

Admin
ERROR: S client not available

Mikhail
01.05.2017
08:48:23
хотя в моем случае это не правильно
т.е. мне нужно считывать только после того, как обновилось

Denis
01.05.2017
08:49:02
угу. вам нужно все или ничего, у вас все строго

Mikhail
01.05.2017
08:49:18
можно себя обезопасить, рефрешить в начале минуты, а считывать в конце
т.е. дать целую минуту на рефреш таблицы

Denis
01.05.2017
08:50:41
то есть пользователи не в бешеном темпе стучатся за рейтингом ближайших в таблицу?

Mikhail
01.05.2017
08:51:19
ну задача чтобы пользователю было раз в минуту обновление
Я думаю можно раз в минуту, но минутной давности

Denis
01.05.2017
08:52:52
а как оно приходит пользователю? один запрос для всех и сервер дальше сам раскидывает уведомления клиентам? или каждый раз в минуту обращается за своим рейтингом?

Google

Mikhail
01.05.2017
08:53:56
Сервер сам отправляет рейтинги юзерам которые онлайн раз в минуту. Потом другой сервер уже тирражирует их по пользователям
т.е. сервер сразу для всех пользователей которые онлайн собирает рейтенги

Denis
01.05.2017
08:57:04
тогда вопрос, сколько по времени занимает сейчас запрос? потому что по моим представлениям, если партицировать горячие данные хотя бы за последние дней 8 (чтобы с запасом) партициями по дню, то можно выгребать запросом куда быстрее минуты. если нормально с индексами подобрать. ну а потом более старые партиции сливать в одну через тот же pg_pathman

Mikhail
01.05.2017
08:58:21
Какой запрос? Это на стадии проекитрования еще ,никаких реальных запросов еще нет
т.е. замеров

Denis
01.05.2017
09:01:46
я думал, вы улучшаете уже готовую систему. что вы думаете по поводу такой схемы - есть родительсткая таблица и девять дочерних (pg_pathman). одна из дочек - жирная и холодная, куда мы скидываем весь мусор (можем вынести на удаленное хранилище даже). остальные 8 дочек - по дню. у каждой дочки сохранены все индексы для запроса, по ним каждую минуту считаем оконной функцией ближайших.
когда проходит день, мы самую старую из восьми дочек сливаем с толстой и холодной и цикл повторяется

Mikhail
01.05.2017
09:04:18
Не очень знаком с понятием родительской таблицы, но в принципе, структура бд в которой в которой 8 таблиц для каждого дня попробую рассмотреть
аааа

Denis
01.05.2017
09:05:02

Mikhail
01.05.2017
09:05:10
сейчас, мы просто в 8-мую таблицу заливаем данные за текущий день
а восьмой таблицой становится та, что была 7-ая

Denis
01.05.2017
09:08:36
смотрите, pg_pathman хорош тем, что он ищет данные по ключу шардирования только в тех партициях, в которых нужно. если у вас ключ шардирования - день, то выбирая данные за последние 7 дней, вы будете заглядывать только в 7 (вроде 7, да?) партиций. каждый день у вас будет образовываться механизмом pg_pathman новая пратиция, а самая старая не будет уже использоваться в запросах. ее можно потом, как будет время, слить с архивной

Mikhail
01.05.2017
09:09:20
мне кажется с materialized view и удалением старых записей по времени или перемещением их в архив попроще выглядит :)

Denis
01.05.2017
09:10:19
правда?) в случае pathman вам не нужно ничего делать, все происходит за вас)) только старые партиции по крону можно сливать штатной функцией
посмотрите его документацию, там все крайне просто https://github.com/postgrespro/pg_pathman

Mikhail
01.05.2017
09:11:02
А смещение 8-ой таблицы на первую?
Это он тоже делать будет?

Denis
01.05.2017
09:11:49
я запутался, кто из них 8, кто 1))

Mikhail
01.05.2017
09:12:58
И кстати, партиционирвоание по статическим значениям можно делать, а у нас тут динамические. Ведь дни меняются
Я просто не очень понимаю как такие таблицы даже создать