@pgsql

Страница 955 из 1062
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
Притом, что сегодня он запускал автовакуум/автоаналайз на эту таблицу
Покажите запрос и EXPLAIN ANALYZE (и лучше сразу \d участвующих таблиц). Второе можно на https://explain.depesz.com/

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
А что за тула?
pev: http://tatiyants.com/pev/

Yaroslav
27.08.2018
10:45:32
Это уже после VACUUM ANALYZE ручного
Кстати, про оценку: может, у Вас status коррелирует с startAt?

Yaroslav
27.08.2018
10:47:10
То есть лучше подсказать индексу, в какую сторону будет делаться ORDER BY?
Причём тут это? ;) PostgreSQL может сканировать индексы в любом направлении... Я имел в виду что-то такое: CREATE INDEX [CONCURRENTLY] ON red_messages(status, startAt);

В каком плане?
В этом: https://explain.depesz.com/s/2KsZ

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

Попробую сейчас такой вариант, спасибо!

Yaroslav
27.08.2018
10:56:26
Хм, действительно, на startAt же вообще ничего не висит, ни в каком виде
Кстати, если Вы просто на startAt повесите, проблема со стабильностью плана, скорее всего, останется. Т.е. PostgreSQL после очередного ANALYZE может "переключаться" на другой индекс. Тут у Вас и так estimations очень косые, так что проще подстраховаться, IMHO. ;)

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

Ибо сейчас он по-прежнему использует индекс на status

Yaroslav
27.08.2018
11:00:31
Ибо сейчас он по-прежнему использует индекс на status
Нисколько. ;) Я не заметил, что в Вашем запросе ORDER BY не по startAt, а по другому полю...

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

Yaroslav
27.08.2018
11:01:46
Ну, переделать недолго, хех
Подождите, на что? Зачем у Вас, кстати, выбирается ctid в запросе?

Andrey ?
27.08.2018
11:02:20
Подождите, на что? Зачем у Вас, кстати, выбирается ctid в запросе?
Чтобы в другом месте по ним сделать апдейт

Yaroslav
27.08.2018
11:03:55
Чтобы в другом месте по ним сделать апдейт
Может, не стоит? Это "внутренняя" штука, и делать так, по идее, ненадёжно.

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

Yaroslav
27.08.2018
11:08:58
Я просто не нашел в свое время как сделать лимит в апдейте
А причём тут LIMIT? Вы лучше значения первичного ключа выбирайте, тогда уж. CTID может измениться, если Вы сразу не блокируете запись (или не работаете на SERIALIZABLE (или хотя бы RR, не помню)).

Andrey ?
27.08.2018
11:09: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
По startAt когда как, иногда 0, иногда - все, иногда половина от status = 0
Да, как-то это непросто... а разных priority у Вас сколько?

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

Andrey ?
27.08.2018
11:34:48
Этот - всегда

Именно с 0

Разных priority - от -1 до 20, обычное состояние - либо много записей с 0, либо мало с > 0

Видимо, поэтому он и решил однажды воспользоваться индексом на priority

Потому что иногда получалось урвать очень маленькое количество записей

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

Видимо, поэтому он и решил однажды воспользоваться индексом на priority
И неудивительно... В смысле, я б на его месте тоже, может, решил бы. ;) Вообще, мне кажестя, идеального индекса именно для этого запроса (так, как он написан) сделать не получится.

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

Volodymyr Kostyrko
27.08.2018
12:20:46
Bucardo.

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

А разве честный Master-Madter не у PostgresPro только?
Он там действительно имеется ?

Bucardo.
Спасибо за ваше мнение

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
То есть в open sourse версии его не будет ? В том же Mysql вроде без проблем можно настроить
Этого я не знаю. На русском можно тут почитать https://habr.com/company/postgrespro/blog/337180/

Alexey
27.08.2018
12:24:14
Bucardo позволяет сделать асинхронный MtM, если между серверами есть расстояние так будет быстрее работать, хотя стоит учитывать что данные могут появлятся в базах не одновременно.
Спасибо за пояснение. У меня к сожалению нет опыта в развертывании и эксплуатации master-master систем Postgres'a. Поэтому тяжело определится с тем что выбрать Bucardo или BDR. Думаю надо почитать хорошенько статьи в инете.

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

Subb98
27.08.2018
12:34:31
А что такое "честный"? ;)
который не обвешивает :D

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'; менял.

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

а если дописать --password ?
Пароль дальше он спрашивает, просто отклоняет потом как неверный.

Стоп.

Вместо 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
А что такое "честный"? ;)
Реальный мастер мастер, а не подобие. И чтобы без проблем, которые нужно вручную править при ошибках репликации.

Вкратце, везде свои ограничения. Choose your poison. ;)
А что из всего доступного имеет меньше всего ограничений ?

Yaroslav
27.08.2018
12:56:21
Реальный мастер мастер, а не подобие. И чтобы без проблем, которые нужно вручную править при ошибках репликации.
Что такое "реальный мастер-мастер"? > И чтобы без проблем, которые нужно вручную править при ошибках репликации. Каких, например, проблем?

А что из всего доступного имеет меньше всего ограничений ?
Они разные, эти ограничения, вот в чём всё дело. Т.е. зависит от того, что Вам нужно.

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