
Ilia
25.01.2018
10:27:36
ЧТо запро сдолжен выдавать?
select tp.id, tp.title
from topics tp
join participants pt on tp.id = pt.topic_id
where (pt.user_id = 11 and tp.updated_at > pt.last_read)
— это понятно, топики, которые пользователь смотрел, и которые обновились.
А вторая часть?
select tp.id, tp.title
from topics tp
join participants pt on tp.id = pt.topic_id
where pt.user_id <> 11 and pt.topic_id not in (select topic_id from participants where user_id = 11)

Subb98
25.01.2018
10:28:02

Ilia
25.01.2018
10:28:25
А нахера ж ему они ?

Google

Yaroslav
25.01.2018
10:29:09
Там не JOIN
Нет, всё же JOIN. Оптимизатору в этом отношении не важно, что в запросе написано.
Когда есть выборка из t1 и t2, и условие вида
t1.col1 operator t2.col2, как, например, здесь:
> tp.updated_at > pt.last_read
это JOIN.

Ilia
25.01.2018
10:29:09
Я думаю, у тебя даже запрос неверный.

Subb98
25.01.2018
10:29:12
Ну, смотри. Вот, например, у нас есть какие-то темы. Они могут быть новые или нет. Допустим, они новые, но пользователь их не видел ещё. Я ему должен их показать.
Или они могли обновиться.

Ilia
25.01.2018
10:30:42
Да у тебя запрос типа Дай мне все обновлённые топики , которые данный пользователь смотрел,
а также ВСЮ ОСТАЛЬНУЮ ХРЕНЬ, ЧТО ТАМ ЕСТЬ.
может просто проще выбирать ВСЁ, и там уже сортировать, и так далее?

Subb98
25.01.2018
10:31:45
Наверное, да, ты прав.

Ilia
25.01.2018
10:32:31
Наверное, да, ты прав.
А коли так, нужно СНАЧАЛА написать правильный запрос, а потом уже думать, как быстро он будет работать.

Subb98
25.01.2018
10:33:14
Логика такова. При создании / просмотре темы создаётся связь User - Topic. Для каждого пользователя нужно получать список тем, которые он не читал.
Ну, я предполагал, что всё составил верно. Сейчас ещё буду думать.

Ilia
25.01.2018
10:33:37
select DISTINCT tp.id, tp.title

Yaroslav
25.01.2018
10:34:52

Google

Междоус
25.01.2018
12:29:08
На слейв сервере проблема с выборками bigint(они по схеме такие). Приходится в запросе приводить к integer, чтобы нормально работало. Что-то сломано в реплике в версии 9.6?

Yaroslav
25.01.2018
12:29:57

Междоус
25.01.2018
12:34:07
Есть user_id::bigint, но при выборке select user_id... не работает запрос на слейве, возвращает пустую строку или ничего не возвращает. Не использует индексы. Еще что-то не делает. Но только в случае что это подзапрос или из join А вот если явно указать select user_id::integer ... начинает работать как надо.
Но дело в:
1. Подзапрос
2. Слейв-сервер
3. Приведение к другому типу
Это абсолютно не нормально, т.к. на мастере такие запросы отрабатывают отлично без лишних приведений типов.

Darafei
25.01.2018
12:35:01
сравни планы, возможно битый индекс
если не работает с index scan и работает с seq scan, то точно битая реплика

Междоус
25.01.2018
12:35:32

Darafei
25.01.2018
12:35:53
сравнивали между чем и чем?
надо не между мастером и слейвом, а с кастом и без каста

Междоус
25.01.2018
12:36:12

Yaroslav
25.01.2018
12:36:44

Междоус
25.01.2018
12:36:59

Darafei
25.01.2018
12:37:05
возможно, битая не только реплика, но и мастер до первой остановки :)

Yaroslav
25.01.2018
12:37:10
Покажите планы запросов (и \d таблиц) на реплике с CAST и без.

Alex
25.01.2018
12:45:46
Это _не проблема_, а нормальное поведение.
почему нормальное поведение когда на реплике сиквенсы убегают? кто их там инкрементит(в моем понимании на реплике их вообще нельзя инкрементить). Как объясняется что это нормальное поведение?

Darafei
25.01.2018
12:46:20
их инкрементят на диске сразу намного, а потом из памяти раздают значения

Yaroslav
25.01.2018
12:47:33

Междоус
25.01.2018
12:53:26

Google

Междоус
25.01.2018
12:54:36
У нас postgres Pro, а не ванила

Yaroslav
25.01.2018
12:55:51

Междоус
25.01.2018
12:56:47
https://pastebin.com/w1ZS5DYJ
Одинаковые
Только что ограничение установлено
Из особенностей - расширение groonga для fts

Yaroslav
25.01.2018
13:00:27
Из особенностей - расширение groonga для fts
А Вас не смущает вот это? ;)
PGroonga isn't crash safe. If your PostgreSQL process is crashed while updating, your PGroonga indexes may be broken. If your PGroonga indexes are broken, you need to recreate PGroonga indexes by REINDEX.
Т.е. Вы пробовали REINDEX на master (или вообще заставить его использовать тот же план, что и реплика)?

Междоус
25.01.2018
13:02:05
Сегодня еще 3 раза пересоздали слейв.
До сегодня проблем как бы не было, т.к. до этого все запросы были только на мастер. А вот сейчас решили раскидать еще и на слейв чистые селекты. А оказывается они не работают. То есть секунд 10 работали после создания слейва, пока не заехал wal с изменениями. И вот. Есть проблема с индексом groonga на слейве.

Yaroslav
25.01.2018
13:04:23

Междоус
25.01.2018
13:04:44
сейчас чекнем мастер
Мастер и слейв одинаковые эксплейныдают при приведении типов и без. То есть поведение одинаковое.
Только получается groonga индекс не работает при реплике. ?

Sergey
25.01.2018
13:10:49

Междоус
25.01.2018
13:11:05

Yaroslav
25.01.2018
13:11:48

Междоус
25.01.2018
13:12:21

Yaroslav
25.01.2018
13:12:35

Google

Междоус
25.01.2018
13:12:37
Получается такие же как и на слейве

Sergey
25.01.2018
13:12:45
как проверить?
Я бы поднял песочницу. Primary + slave. Затем накатил slave до упора, зашатдаунил primary, потом slave и сравнил файлы индекса

Yaroslav
25.01.2018
13:13:07

Sergey
25.01.2018
13:13:16
Ну либо в лоб применимость - запромотил slave и смотришь как там индекс поживает.

Междоус
25.01.2018
13:13:41
Где разные? Везде?
без каста на мастере и слейве одинаково.
с кастом на мастере и слейве одинаково.
каст и без каста на мастере разные.
каст и без каста на слейве разные.

Yaroslav
25.01.2018
13:14:50

Междоус
25.01.2018
13:15:26

Yaroslav
25.01.2018
13:16:13

Darafei
25.01.2018
13:16:18

Междоус
25.01.2018
13:16:46
https://github.com/pgroonga/pgroonga/issues/25

Yaroslav
25.01.2018
13:19:20
А вот этого мы не знаем
Эээ... что? Если [детерминированный и т.д.] запрос даёт разные результаты в зависимости от плана, значит что-то не так, нет?

Междоус
25.01.2018
13:20:33

Yaroslav
25.01.2018
13:21:53

Междоус
25.01.2018
13:23:24

Yaroslav
25.01.2018
13:24:21

Междоус
25.01.2018
13:26:58

Yaroslav
25.01.2018
13:28:07

Междоус
25.01.2018
13:29:47

Darafei
25.01.2018
13:30:54
но с кастом у вас
" -> Index Scan using messages_8_chat_id_message_id_key on messages_8 msg_7 (cost=0.43..8.46 rows=1 width=1006)"
" Index Cond: ((chat_id = (last_message.chat_id)::integer) AND (message_id = (last_message.max)::integer))"
а без каста
" -> Index Scan using messages_8_id_chat_id_message_id_lower_idx on messages_8 msg_7 (cost=0.00..4.01 rows=1 width=1006)"
" Index Cond: ((chat_id = last_message.chat_id) AND (message_id = last_message.max))"

Google

Darafei
25.01.2018
13:31:03
индекс messages_8_id_chat_id_message_id_lower_idx битый

Междоус
25.01.2018
13:31:13
каст не нужен по сути. мы выявили что проблема не на мастере. и не с индексом на мастере. мы выявили что слейв норм работает до первых wal логов. то есть беда именно в индексе и только после wal. плюс ссылки - мы не включили groonga индекс мигрировать
last_message.max это бигинт.
а каст в инт
каст не нужен

Darafei
25.01.2018
13:32:42
каст просто срубает план, заходящий в битый индекс, в планировщике

Yaroslav
25.01.2018
13:33:00
> каст и без каста на мастере разные.
> каст и без каста на слейве разные.
Вот же Вы пишите... Я там про _результат_ спрашивал, не про планы.

Междоус
25.01.2018
13:34:35

Yaroslav
25.01.2018
13:35:28
> каст и без каста на мастере разные.
> если без каста и с кастом в бигинт - то идентичные!!!
Я один здесь вижу противоречие? ;)

Междоус
25.01.2018
13:36:51
нашли. индекс на слейве 160кб, на мастере несколько гигов
сейчас будем настраивать реплику индекса. с тем шаманствами, которые вы выше показывали

Just
25.01.2018
13:43:34
подскажите, пожалуйста, как получить результаты, даже если искомое поле NULL, т.е. в условии стоит where filed!=1, и как я заметил, NULL не попадает под это, есть какой-то флаг, что бы не писать where filed!=1 or filed is NULL?

Darafei
25.01.2018
13:44:06
тебе нужны is distinct from и is not distinct from

Just
25.01.2018
13:45:23

Darafei
25.01.2018
13:45:48
если кто-то написал код, не зная sql, его нужно переписать

Just
25.01.2018
13:46:34

Yaroslav
25.01.2018
14:05:30