@pgsql

Страница 315 из 1062
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
Ну все, грустим, btree нам не подошёл. Можно ещё попробовать bloom
и правда грустим, почитаю о bloom. спасибо, за помощь, в любом случае)

Denis
01.05.2017
04:46:58
и правда грустим, почитаю о bloom. спасибо, за помощь, в любом случае)
Незачем что. Когда будете экспериментировать, попробуйте построить индекс по date_trunc('year', date), чтобы можно было использовать условие =. Ну и отпишитесь, что получится)

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
А покажите размер таблицы.

а почему все-таки выбрать 300 записей, по id'ам с 2.8 млн таблицы так долго или это нормально?
Вообще 300 разрозненных id выбрать из файла в несколько гб и правда может буть долго, но я верю, что это можно победить

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
а как вы удостоверяетесь, что это страницы с диска, а не с кеша?
Вообще если вы хотите именно 100% с диска, сейчас устрою проверку

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/ вот сравнение, на небольшой таблице разница в разы, но не в сотни раз. а какая у вас структура таблицы? хочу такую же развернуть и потестить то же самое

Denis
01.05.2017
06:09:52
Mikhail
01.05.2017
08:16:19
Я понимаю, что статистику ближайших надо будет строить часто и быстро. Поэтому нужен кеш и я предлагаю создать таблицу weekly_deals и использовать ее как регистр оборотов. План примерно такой: Таблица deals: 1. Покрывающий btree индекс date_trunc('day', date), user_id, amount. Опционально партицирование через pg_pathman Таблица weekly_deals (userid, amount): 2. Аудит в таблицу weekly_deals_audit через триггер на строку 3. Транзакция старт 4. Блокировка на запись deals 5. Вставить в weekly_deals агрегацию из deals за 6 дней (без сегодня) 6. Построить gist индекс по amount (create extension) 7. На deals добавить построчный триггер обновления amount для каждой новой вставки 8. Транзакция коммит 9. Регламентное ежедневное задание, удаляющее из deals_weekly данные за самый старый день Ну и ищите ближайших в weekly_deals через gist
Это решение не подходит, неделя отсчитываться от текущего времени, т.к. раз в минуту нужно считывать эти рейтинги

Denis
01.05.2017
08:17:32
Это решение не подходит, неделя отсчитываться от текущего времени, т.к. раз в минуту нужно считывать эти рейтинги
То есть неделя назад - это не начало дня, а ровно 24*7 часов назад, секунда в секунду

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

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

Может в сторону хранимых процедур посмотреть, сделать логику работы с курсором например
Курсоры плохо по производительности обычно, а хранимки - да, хорошо. Но куда их пристроить?

Denis
01.05.2017
08:22:45
Пока не знаю :)
Попробуйте, но мои опыты раньше говорили - плохо)

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

и тогде я на ней создам индексы, которые собирался

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

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

Admin
ERROR: S client not available

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 таблиц для каждого дня попробую рассмотреть

аааа

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
И кстати, партиционирвоание по статическим значениям можно делать, а у нас тут динамические. Ведь дни меняются

Я просто не очень понимаю как такие таблицы даже создать

Страница 315 из 1062