@pgsql

Страница 263 из 1062
Darafei
07.03.2017
11:58:03
бред, у тебя сортировка Sort Key: messages.y_id не по индексу

покажи все индексы на messages

\d+ messages

Vladimir
07.03.2017
12:00:00
schemaname | tablename | indexname | tablespace | indexdef ------------+-----------+--------------------------+------------+---------------------------------------------------------------------------------------------- public | messages | messages_pkey | | CREATE UNIQUE INDEX messages_pkey ON messages USING btree (y_id) public | messages | message_date_created_idx | | CREATE INDEX message_date_created_idx ON messages USING btree (date_created DESC NULLS LAST) (2 rows)

Google
Darafei
07.03.2017
12:01:45
там неупорядоченный хеш? отстреливаем дальше set enable_mergejoin to off;

и так пока не получим интересующий нас план или обнаружим, что он невозможен / тормозит

если он не тормозит, рассматриваем на нём косты

Vladimir
07.03.2017
12:05:25
там неупорядоченный хеш? отстреливаем дальше set enable_mergejoin to off;
эмн. y_id определна как строка, там хранится md5 хэш, он мне приходит из сторонней апишки. они все упорядочены, т.е. y_id каждой новой записи будет больше чем предыдущий, если странить построково

упорядочены = в смысле я щас заметил, что они по порядку идут, но в базе у меня никаких фишек нет для этого

Darafei
07.03.2017
12:06:52
cluster messages using messages_pkey;

пусть идут по порядку

Vladimir
07.03.2017
12:10:32
хм, всё равно 12 секунд..

Darafei
07.03.2017
12:12:06
да не смотри ты в секунды, в план смотри

где план без мержжойна? :)

dmitriy
07.03.2017
12:14:48
вангую, что если построите индекс по chats (unread DESC, last_msg_id) или хотя бы (unread DESC), то должно все это превратиться в Nested Loop из 20 итераций, что должно быть существенно быстрее, нужно потрогать руками

Vladimir
07.03.2017
12:14:51
https://explain.depesz.com/s/HZqD enable_hashjoin = on, enable_mergejoin = off или надо оба off?

Darafei
07.03.2017
12:15:38
оба off

Google
Darafei
07.03.2017
12:15:54
так он откатился к хешджойну, который был в самом начале

хочется посмотреть в секскан по chats и индексскан по messages с nested loop

Vladimir
07.03.2017
12:17:26
вангую, что если построите индекс по chats (unread DESC, last_msg_id) или хотя бы (unread DESC), то должно все это превратиться в Nested Loop из 20 итераций, что должно быть существенно быстрее, нужно потрогать руками
CREATE UNIQUE INDEX chats_pkey ON chats USING btree (y_id) CREATE INDEX ix_chats_date_created ON chats USING btree (date_created) CREATE INDEX chat_unread_idx ON chats USING btree (unread DESC NULLS LAST) CREATE INDEX chat_last_msg_idx ON chats USING btree (last_msg_id) вот такие индексы есть у чатов

Darafei
07.03.2017
12:17:52
а сортируешь в запросе desc, а не desc nulls last

Vladimir
07.03.2017
12:18:15
оба off
https://explain.depesz.com/s/5Ipk

Vladimir
07.03.2017
12:26:54
ну ок, но всё равно всё по старому - https://explain.depesz.com/s/TBb

меня сейчас на этом сайте забанят )

Darafei
07.03.2017
12:27:45
explain analyze select * from ( select chats.y_id as chats_y_id, chats.unread as chats_unread from chats join messages on messages.y_id = chats.last_msg_id where chats.unread = true order by messages.date limit 20 ) union all select * from ( select chats.y_id as chats_y_id, chats.unread as chats_unread from messages join chats on messages.y_id = chats.last_msg_id where chats.unread = false order by messages.date limit 20 ) limit 20;

чую разные планы на обе части

Vladimir
07.03.2017
12:29:24
chats.unread integer если чо

:)

Darafei
07.03.2017
12:30:00
у вас 65536 разных непрочитываний? :)

Vladimir
07.03.2017
12:30:33
да не, раньше просто хотел хранить там счетчик, потом забил и стал использовать просто как флаг

https://explain.depesz.com/s/xyw8

Darafei
07.03.2017
12:35:02
поменяй в первой части join messages on messages.y_id = chats.last_msg_id на join lateral (select * from messages where messages.y_id = chats.last_msg_id) on true

и cluster chats using chat_last_msg_idx; analyse chats; перед тем

(больше гвоздей в план!)

сайдноут, лучше переложи md5 из текста в uuid, тогда у него abbreviated keys sort может заработать

Google
Vladimir
07.03.2017
12:41:36
чёто туплю explain analyze select * from ( select chats.y_id as chats_y_id, chats.unread as chats_unread from chats join lateral (select * from messages where messages.y_id = chats.last_msg_id) as Z on true where chats.unread = 1 order by messages.date_created limit 20 ) as X union all select * from ( select chats.y_id as chats_y_id, chats.unread as chats_unread from messages join chats on messages.y_id = chats.last_msg_id where chats.unread = 0 order by messages.date_created limit 20 ) as Y limit 20; ERROR: missing FROM-clause entry for table "messages" LINE 9: order by messages.date_created

сайдноут, лучше переложи md5 из текста в uuid, тогда у него abbreviated keys sort может заработать
не могу, апишка сторонняя md5 оперирует, мне удобнее тоже везде его юзать

Darafei
07.03.2017
12:43:49
as messages вместо as Z

вообще, я бы прожёг дату последнего сообщения рядом с last_msg_id, тогда можно было бы делать сортировку в одной таблице

Vladimir
07.03.2017
12:47:33
https://explain.depesz.com/s/l1Wx

я уж тоже подумал про это.

Darafei
07.03.2017
12:49:29
join lateral (select * from messages where messages.y_id = chats.last_msg_id offset 0) as messages on true

но и так уже в два раза скостили

если это админ-онли, я бы забил уже на его оптимизацию и смотрел, что там у юзеров

Vladimir
07.03.2017
13:35:23
блин, там вообще всё весело. у чата есть пост1 и пост2 (разные таблицы). у обоих типов постов есть аккаунт. у поста1 если рассылка1, у поста2 есть рассылка2. у рассылки1, рассылки2 и аккаунта есть юзер. сейчас я всё это джойню и возвращаю все чаты, где (пост1.аккаунт = юзер И пост1.рассылка1 = юзер) ИЛИ (пост2.аккаунт = юзер И пост2.рассылка2 = юзер)

короче я думаю надо вносить в chats дату последнего сообщения и юзера и вообще ничего не джойнить

Darafei
07.03.2017
13:37:26
ну да, схему под access patterns пилить

Роман
07.03.2017
17:57:52
Господа, стыдно о таком спрашивать конечно, но подкиньте теории по индексам, есть один запрос,который довольно долго выполняется и при этом не использует индекс, хочу выяснить, почему так происходит

Evgeniy
07.03.2017
18:00:20
а что используется вместо него?

есть две групных причины не использовать индекс - он не подходит, или он недостаточно селективный

Роман
07.03.2017
18:05:01
Имеется 2 столбца по которым просиходит поиск — внешний ключ(int, user_id) и datetime, оператор and, при этом создан индекс по обоим полям, т.е. CREATE INDEX ON table(user_id, datetime)

Используется seq scan

таблица довольно большая по размерам

прошу прощения, heap scan

Evgeniy
07.03.2017
19:16:54
покажи запрос и эксплейн

Google
Роман
08.03.2017
07:56:27
покажи запрос и эксплейн
Спасибо, дело было в довольно сильном затупе с моей стороны — для сравнения даты использовал datetime::DATE, в то время как индекс был построен без конвертации типа

Konstantin
08.03.2017
08:50:41
Завершена разработка защищенной отечественной СУБД Синергия-БД, основанной на PostgreSQL http://www.opennet.ru/opennews/art.shtml?num=46160 Федеральный ядерный центр в Сарове (РФЯЦ-ВНИИЭФ) совместно с компанией Postgres Professional завершили проект по созданию защищенной системы управления базами данных «Синергия-БД», основанной на кодовой базе СУБД PostgreSQL. «Синергия-БД» предназначена для использования в качестве хранилища данных на предприятиях, предъявляющих повышенные требования к надежности и безопасности информационных систем. В первую очередь, это контур ядерно-оружейного и оборонно-промышленного комплекса страны, а также органы исполнительной власти федерального и регионального уровня. #opennet

Vladimir
09.03.2017
12:03:59
@Komzpa @pensnarik @raksita парни, всем спасибо за помощь с анализом планов, в итоге отказался от джойна, добавил избыточность, зато теперь всё летает?

Admin
ERROR: S client not available

Wom
09.03.2017
13:18:26
pglogical можно использовать как замену streaming replication?

Айтуар
09.03.2017
13:19:04
Wom
09.03.2017
13:20:07
А какую цель преследуете?
иметь реплику с данными, с которой можно делать периаодически dump. и на которую можно отправлять r/o запросы pgpool'ом

Wom
09.03.2017
13:21:03
streaming чем не нравится?
dump нельзя сделать. да и вообще весь кластер в режиме r/o

Wom
09.03.2017
13:21:49
можно
dump длится более часа

ну вот на hot_snadby dump и вылетает с ошибкой

Wom
09.03.2017
13:28:42
какой?
ERROR: canceling statement due to conflict with recovery

Айтуар
09.03.2017
13:30:40
ERROR: canceling statement due to conflict with recovery
а там нужно ставить в настройках postgres чтобы слейв не блокировал транзакции на мастере, насколько я помню, название параметра не помню.

Wom
09.03.2017
13:31:14
я ставил. место на мастере заканчивается

Айтуар
09.03.2017
13:31:19
а вот нашёл hot_standby_feedback = on

Mike Chuguniy
09.03.2017
13:31:54
Не, это с репликой прилетают удаление данных, которые потом используются в дампе. Нужна задержка применения логов.

Google
Mike Chuguniy
09.03.2017
13:32:33
Вот этот параметр крутить надо: max_standby_archive_delay (integer)

Айтуар
09.03.2017
13:32:46
я ставил. место на мастере заканчивается
ну да, пока дамп не закончится, слейв не может применять валы

Mike Chuguniy
09.03.2017
13:33:39
@Aytuar ну или этот, да.

В любом случае нужна задержка применения изменений на слейве в момент создания дампа.

Wom
09.03.2017
13:36:08
это не даёт ответа на исходный вопрос. в моём случае дамп с хот стендбая вызывает проблемы

Sergey
09.03.2017
13:50:39
Ну значит с pglogical будет заканчиваться место на slave?

Sergey
09.03.2017
13:56:15
Открытый pg_dump'ом снапшот не потребует аналогичного количества WAL'ов на slave?

Mike Chuguniy
09.03.2017
13:58:01
Самое главное. Насколько я помню, pglogical - это надстройка над logical decoding, у которой есть некоторые ограничения по применению, например, только одна база из кластера обслуживается этим безобразием.

Andrey
09.03.2017
14:10:00
ho all

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