
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
упорядочены = в смысле я щас заметил, что они по порядку идут, но в базе у меня никаких фишек нет для этого

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

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

dmitriy
07.03.2017
12:19:22

Andrey
07.03.2017
12:24:16

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

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 парни, всем спасибо за помощь с анализом планов, в итоге отказался от джойна, добавил избыточность, зато теперь всё летает?

raksita
09.03.2017
12:04:26

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'ом

Айтуар
09.03.2017
13:20:30

Wom
09.03.2017
13:21:03

Айтуар
09.03.2017
13:21:17
hot_standby

Wom
09.03.2017
13:21:49
можно
dump длится более часа
ну вот на hot_snadby dump и вылетает с ошибкой

Айтуар
09.03.2017
13:22:37

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

Айтуар
09.03.2017
13:30:40

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

Wom
09.03.2017
13:33:19

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?

Wom
09.03.2017
13:55:12

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

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

Wom
09.03.2017
13:58:25

Andrey
09.03.2017
14:10:00
ho all