
Darafei
11.09.2017
15:08:14
а, вижу.
а что значит "вешая курсор"?
по идее, вам достаточно просто вставлять и ловить эксепшен

Antony
11.09.2017
15:11:10
Поток с запросом висит загрузка цп 100%, (как будто бесконечный цикл), за месяц набирается 3-4 таких висящих запроса

Google

Alexandr
11.09.2017
15:11:44
с каким запросом он висит?

Дарья
11.09.2017
15:12:37
Всем привет! Работаю в крупной международной компании FMCG сектора, где на данный момент открыта позиция "Программист SQL". Основной функционал: автоматизация отчетов для бизнеса. Кому потенциально может быть интересно, готова в личных сообщениях более подробно рассказать про компанию, условия и тд.

Alexandr
11.09.2017
15:12:43
по идее consumer и producer изолированы, и "читающая" сторона вообще ничего не должна знать про дубли

Antony
11.09.2017
15:13:05
QUERY: insert into address (lat, lon, lang, address) values (450523,182867,20,'R464a, Općina Odžak'), (450194,183078,20,'Slavka Grebenarevića, Općina Vukosavlje'), (450407,182928,20,'R464a, Općina Odžak'), (450085,183120,20,'Slavka Grebenarevića, Općina Vukosavlje'), (450553,182851,20,'R464a, Općina Odžak');

Alexandr
11.09.2017
15:13:38
то есть на вставке?

Darafei
11.09.2017
15:13:45

Antony
11.09.2017
15:14:01
да на вставке

Tenni
11.09.2017
15:14:29

Дарья
11.09.2017
15:14:32
Россия, Москва

Alexandr
11.09.2017
15:14:50
добавьте on conflict do nothing

Darafei
11.09.2017
15:14:57

Antony
11.09.2017
15:15:17
для этого тригер и писался, старый постгре 9.3

Alexandr
11.09.2017
15:15:25
аа))

Google

Darafei
11.09.2017
15:15:36
вообще, да, лучше всего пойти и всё пообновлять, начиная с psycopg2

Antony
11.09.2017
15:17:08
Есть проблема. В старой версии psycopg2 по другому разбираются типы из строки (например где то json строка, а где то json разбирается в объекты питона), при обновлении пол проекта слетит, а там старые тонны кода

Andrey
11.09.2017
15:18:19

Antony
11.09.2017
15:18:58
Пачкой вставляется от 2 до 1000 ключей, нужно что бы если некоторые дублируются они были пропущены, а остальные вставлены. Какие могут быть варианты решения помимо on conflict и локов?
Есть ещё вариант с повышеним уровня изоляции транзакции и повтором отвалившегося запроса

Anatoliy
11.09.2017
15:20:16
QUERY: insert into address (lat, lon, lang, address) values (450523,182867,20,'R464a, Općina Odžak'), (450194,183078,20,'Slavka Grebenarevića, Općina Vukosavlje'), (450407,182928,20,'R464a, Općina Odžak'), (450085,183120,20,'Slavka Grebenarevića, Općina Vukosavlje'), (450553,182851,20,'R464a, Općina Odžak');
дык у вас в одном запросе все и дублируется

Antony
11.09.2017
15:20:54
в упор не вижу не одного дубиката

Alexandr
11.09.2017
15:21:17
проверьте, что в пачке нет дублей

Antony
11.09.2017
15:21:23
(450523,182867,20,'R464a, Općina Odžak'),
(450194,183078,20,'Slavka Grebenarevića, Općina Vukosavlje'),
(450407,182928,20,'R464a, Općina Odžak'),
(450085,183120,20,'Slavka Grebenarevića, Općina Vukosavlje'),
(450553,182851,20,'R464a, Općina Odžak')

Andrey
11.09.2017
15:21:54

Antony
11.09.2017
15:21:54
Вот запрос из лога с исключением
QUERY:
insert into address (lat, lon, lang, address) values
(450523,182867,20,'R464a, Općina Odžak'),
(450194,183078,20,'Slavka Grebenarevića, Općina Vukosavlje'),
(450407,182928,20,'R464a, Općina Odžak'),
(450085,183120,20,'Slavka Grebenarevića, Općina Vukosavlje'),
(450553,182851,20,'R464a, Općina Odžak');

Anatoliy
11.09.2017
15:22:35
это все строки из пачки?

Antony
11.09.2017
15:22:43
да

Alexandr
11.09.2017
15:23:48
pk - точно (lat, lon, lang) ?

Antony
11.09.2017
15:24:07
А как обстоят дела с передачей в процедуру 8000 аргументов при вставке 1000 строк
А если обернуть вставку в хранимку и внутри ловить исключение unique_violation?
да, вверху скрипт создания таблицы
create table address (lat int not null, lon int not null, lang int not null, address text, PRIMARY KEY(lat, lon, lang));

Anatoliy
11.09.2017
15:24:42
это из схемы

Google

Anatoliy
11.09.2017
15:24:46
а в базе?)

Alexandr
11.09.2017
15:25:41
у вас такое поведение даже на одном потоке?

Antony
11.09.2017
15:26:26
В базе тоже самое, не могу скопировать
Потоков всегда много. На одном все ок,тригер работает

Alexandr
11.09.2017
15:30:56
все идет к тому, что у pg возникает race condition при обработке пачки и применения тригера
но раз вы не хотите обновляться, то лучше переписать код
например на optimistic lock'ах

Antony
11.09.2017
15:32:33
А можно ссылку на доку по ним?

Alexandr
11.09.2017
15:33:08
погуглите, это программно делается на любой базе
или begin, select, filter unique, insert, commit прямо в коде

Antony
11.09.2017
15:33:44
Ок, благодарю

Darafei
11.09.2017
15:33:53
а вообще, для адресов - можно отключить констрейнт и делать на чтении limit 1

Anatoliy
11.09.2017
15:34:18
так себе решение )

Alexandr
11.09.2017
15:34:28
база будет бухнуть, а при нагрузке вообще беда

Antony
11.09.2017
15:34:51
А что значит лимит 1. Они селнктяться тысячами

Darafei
11.09.2017
15:34:55
ну, если триггер оставить, бухнуть она будет не больше, чем на количество падающих сейчас запросов

Antony
11.09.2017
15:42:35
предварительно не известно есть данные или нет, база распухнет без пк

Darafei
11.09.2017
15:43:31
индекс не обязан быть обязательно pk, это может быть просто индекс
проверка по нему займёт столько же времени

Antony
11.09.2017
15:52:58
Да, но база будет сильно руяхнуть. С не уникальным индексом со временем будет расти

Google

Antony
11.09.2017
15:53:35
количество считанных с диска страниц и в этого
На больших запросах начнёт уступать сильно. До этого индекс был не уникальный
Прошу прощения за опечатки т9

Darafei
11.09.2017
15:55:19
триггер будет делать точно такую же проверку, дубликаты в большинстве случаев вставляться не будут
в тех сценариях, где сейчас оно падает с констрейнтом, оно начнёт просто вставлять четыре дубликата в месяц

Antony
11.09.2017
15:57:17
Понял вас, спасибо

Yura
11.09.2017
16:02:51

Alexander
11.09.2017
16:04:02

Yura
11.09.2017
16:04:39
Будь готов, что они могут фейлиться в момент, когда ты посылаешь commit.

Alexander
11.09.2017
16:05:17

Yura
11.09.2017
16:06:38
Есть один истинно верный уровень - serializable.
Всё остальное - компромис между трудозатратами на верификацию кода и производительностью (ибо гарантировать serializable накладно).
( it was joke. every joke has grain of truth )

Viktor
12.09.2017
10:41:11
гуру пг, подскажите: как можно получить именованный эксклюзивный лок в пг? киньте маном, если есть готовое

Dmitrii
12.09.2017
10:46:39
pg_try_advisory_lock/pg_try_advisory_unlock
Вроде как

Yura
12.09.2017
10:47:49
https://www.postgresql.org/docs/9.6/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS

Viktor
12.09.2017
10:48:20
спасибо

Oleg
12.09.2017
11:11:19
pg_try_advisory_xact_lock() для использования в контексте транзакции

Mikhail
12.09.2017
11:14:38
Да, сессионные блокировки вообще сложно придумать зачем надо

Google

Oleg
12.09.2017
11:17:04
Насколько я помню освобождение advisory_lock там автоматическое после commit/rollback транзакции

Mikhail
12.09.2017
11:17:50
Это в транзакционных xact
Но ребят , там все равно гонки везде )
Так как это приложение уже
Надо смотреть задачу
Вы не очередь делаете очередную ?

Darafei
12.09.2017
11:19:47
session level нужны, например, если у тебя всё написано на кучке psql -f без явных begin/commit, потому что незачем снапшотить

Mikhail
12.09.2017
11:20:49
Возможно )

Viktor
12.09.2017
11:26:12

Mikhail
12.09.2017
11:30:22
Бррр)
Тогда лучше скип локед смотрите
Иначе там все может быть сильно хитрее чем кажется на первый взгляд
Вот тут вас все понятно например
http://dklab.ru/chicken/nablas/53.html
Там есть хак с дофильтровкой
Так как локи то мимо снепшота
Хотя у вас может быть другая какая-то архитектурная схема : но эта заметка будет полезна в любом случае
Ну и смотрите конечно на скиплокед

Viktor
12.09.2017
11:37:13
скип локед уже заюзан, сейчас вспомню зачем там обычный именованный лок