
alex
27.08.2018
10:09:29
в таблице миалитем - хранится очередь писем и каой у них статус.
в таблице миалконнектор - ранится на какой ящик приехало письмо

Anton [Mgn, az09@osm]
27.08.2018
10:10:47
Чуть длиннее id, не находишь?..)

alex
27.08.2018
10:11:31
нет. не нахожу

Google

Artyem
27.08.2018
10:12:48
так у тебя столбец integer, а в запросе ты ему строку передаёшь

alex
27.08.2018
10:13:20
ааа, вот я ступит ))

Yaroslav
27.08.2018
10:32:36


Andrey ?
27.08.2018
10:35:41
Покажите запрос и EXPLAIN ANALYZE (и лучше сразу \d участвующих таблиц).
Второе можно на https://explain.depesz.com/
Table "public.red_messages"
Column | Type | Collation | Nullable | Default
--------------------+--------------------------+-----------+----------+---------
id | uuid | | not null |
ourReceiverId | character varying(255) | | |
providerReceiverId | character varying(255) | | |
providerMessageId | character varying(255) | | |
sender | character varying(255) | | not null |
tag | character varying(255) | | not null |
provider | character varying(255) | | not null |
status | integer | | not null |
payload | jsonb | | not null |
startAt | timestamp with time zone | | not null | now()
sentAt | timestamp with time zone | | |
publicId | integer | | not null |
createdAt | timestamp with time zone | | not null |
updatedAt | timestamp with time zone | | not null |
errorMessage | character varying(255) | | |
priority | integer | | not null | 0
receiverPhone | character varying(255) | | |
lifetime | integer | | not null | 86400
Indexes:
"red_messages_pkey" PRIMARY KEY, btree (id)
"red_messages_priority" btree (priority)
"red_messages_provider_message_id" btree ("providerMessageId")
"red_messages_sender" btree (sender)
"red_messages_status" btree (status)
"red_messages_tag" btree (tag)
Foreign-key constraints:
"red_messages_publicId_fkey" FOREIGN KEY ("publicId") REFERENCES publics(id)
https://explain.depesz.com/s/2KsZ
SELECT "ctid" FROM "red_messages" AS "red_message" WHERE "red_message"."status" = 0 AND "red_message"."startAt" <= CURRENT_TIMESTAMP ORDER BY "red_message"."priority" DESC LIMIT 30;
Как-то так
(AS добавила ORM)
Это уже после VACUUM ANALYZE ручного
До него осталась json-версия эксплейна


Yaroslav
27.08.2018
10:42:18
Как-то так
Это, насколько я вижу, т.н. early abort plan.
(см. https://www.postgresql.org/message-id/541A2335.3060100@agliodbs.com , если интересны детали.)
Но, вкратце, дело в том, что у Вас нет идеального индекса для данного запроса, во-первых, и, возможно, что-то не так со статистикой, во-вторых:
(cost=0.43..3505.44 rows=1344 width=10) (actual time=0.136..0.136 rows=0 loops=1)
— Это очень большая ошибка в оценке.
Проще будет создать подходящий индекс (чтобы не заставлять планировщик гадать, выбирая среди менее подходящих).

Andrey ?
27.08.2018
10:44:41
То есть лучше подсказать индексу, в какую сторону будет делаться ORDER BY?

Roman
27.08.2018
10:44:59
А что за тула?

Google

Andrey ?
27.08.2018
10:45:12

Yaroslav
27.08.2018
10:45:32

Andrey ?
27.08.2018
10:46:18

Yaroslav
27.08.2018
10:47:10

Andrey ?
27.08.2018
10:52:42
Хм, действительно, на startAt же вообще ничего не висит, ни в каком виде
Попробую сейчас такой вариант, спасибо!

Yaroslav
27.08.2018
10:56:26

Andrey ?
27.08.2018
10:56:48
Сколько ему нужно времени чтобы осознать, что появился вот такой замечательный индекс и можно его использовать?
Ибо сейчас он по-прежнему использует индекс на status

Yaroslav
27.08.2018
11:00:31

Andrey ?
27.08.2018
11:01:04
Ну, переделать недолго, хех

Yaroslav
27.08.2018
11:01:46

Andrey ?
27.08.2018
11:02:20

Yaroslav
27.08.2018
11:03:55

Andrey ?
27.08.2018
11:04:19
Я просто не нашел в свое время как сделать лимит в апдейте

Yaroslav
27.08.2018
11:08:58

Andrey ?
27.08.2018
11:09:48
Там такой случай, что вообще не страшно если он изменится, даже наоборот, наверное, лучше не апдейтать при изменении

Yaroslav
27.08.2018
11:10:48

Google

Andrey ?
27.08.2018
11:10:59
10.3

Yaroslav
27.08.2018
11:17:06
А под условие по startAt много записей попадает? Сколько всего в таблице, кстати?

Andrey ?
27.08.2018
11:18:16
Всего - около 1.5 миллионов
По startAt когда как, иногда 0, иногда - все, иногда половина от status = 0
По status = 0 - от 0 до 100000 в один момент

Yaroslav
27.08.2018
11:32:05
И да, запрос (или подобные запросЫ) всегда делается со "status = 0" (именно этой константой)?

Andrey ?
27.08.2018
11:34:48
Этот - всегда
Именно с 0
Разных priority - от -1 до 20, обычное состояние - либо много записей с 0, либо мало с > 0
Видимо, поэтому он и решил однажды воспользоваться индексом на priority
Потому что иногда получалось урвать очень маленькое количество записей

Yaroslav
27.08.2018
11:42:10
Именно с 0
Можно тогда частичный индекс попробовать.

Andrey ?
27.08.2018
11:43:33
А вообще, каков шанс, что он имея индекс на status, priority внезапно решит соскочить на, например, только priority?

Yaroslav
27.08.2018
11:53:12
А вообще, каков шанс, что он имея индекс на status, priority внезапно решит соскочить на, например, только priority?
Хмм... по идее, вообще не должен "соскакивать" таким образом (может, я чего не вижу...).
И, опять-таки, почему бы не частичный индекс (с WHERE status = 0)?
Проблема в том, что он может "соскакивать" на другие...
Хотя... если по startAt Вы ничего не создадите, "соскакивать" планировщику будет уже некуда. :)

Terminator
27.08.2018
12:18:03
Alexey Medov будет жить. Поприветствуем!

Alexey
27.08.2018
12:19:40
Всем привет !
Скажите пожалуйста, какое решение лучше всего использовать для разворачивания PostgreSQL кластера Master - Master ?

Google

Alexey
27.08.2018
12:19:52
Я сейчас рассматриваю BDR

Владлен
27.08.2018
12:20:38

Volodymyr Kostyrko
27.08.2018
12:20:46
Bucardo.

Roman
27.08.2018
12:21:14

Alexey
27.08.2018
12:21:33
И второй вопрос. Знает ли кто-нибудь, планируется ли в ближайшее время выпуск PostgreSQL со встроенное нормальной репликацией мастер слейв и мастер - мастер ?
Я где то слышал что в 10 версии должен появится Master-Master

Roman
27.08.2018
12:22:20

Alexey
27.08.2018
12:22:59
То есть в open sourse версии его не будет ? В том же Mysql вроде без проблем можно настроить

Volodymyr Kostyrko
27.08.2018
12:23:47
Bucardo позволяет сделать асинхронный MtM, если между серверами есть расстояние так будет быстрее работать, хотя стоит учитывать что данные могут появлятся в базах не одновременно.

Roman
27.08.2018
12:23:51

Alexey
27.08.2018
12:24:14

Volodymyr Kostyrko
27.08.2018
12:26:35
…а также поднять и поэкспериментировать.

Yaroslav
27.08.2018
12:33:08

Subb98
27.08.2018
12:34:31

Yaroslav
27.08.2018
12:34:42

Terminator
27.08.2018
12:36:39
@AlexeyMihaylov будет жить. Поприветствуем!

Google

Terminator
27.08.2018
12:36:48
@White2demon будет жить. Поприветствуем!

Alexey
27.08.2018
12:39:30
Люди, помогите, пожалуйста.
В postgres есть пользователь с паролем. Когда пытаюсь сделать
psql db userName
, получаю отлуп: psql: FATAL: password authentication failed for user userName
Хотя, пароль уже через ALTER USER user_name WITH PASSWORD 'new_password'; менял.

ко?TEXHIK
27.08.2018
12:41:23

elfiki
27.08.2018
12:41:51

Alexey
27.08.2018
12:42:09
проверь, что ему разрешено подключение по паролю в pg_hba.conf
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all md5
host replication all 127.0.0.1/32 md5
host replication all ::1/128 md5
Стоп.
Вместо userName ввел username - и прокатило О_о
Странно, ведь пользователь создавался так:
sudo -u postgres psql -c "CREATE USER userName WITH PASSWORD 'password';"

Roman
27.08.2018
12:46:23

Alexey
27.08.2018
12:46:47
Спасибо за помощь.

Yaroslav
27.08.2018
12:47:13

Alexey
27.08.2018
12:53:53
А что такое "честный"? ;)
Реальный мастер мастер, а не подобие. И чтобы без проблем, которые нужно вручную править при ошибках репликации.

Yaroslav
27.08.2018
12:56:21