|
Sequence инкрементируется, даже если не произошел INSERT
|
|||
---|---|---|---|
#18+
Есть таблица со следующей структурой: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Каждый день таблица обновляется. До недавних пор таблица обновлялась следующим образом: если UNIQUE section_id уже существует (т.е. выполняется обычный SELECT EXISTS), то ничего добавлять не нужно. На вход каждый день приходит около 10,000 записей. Т.е. 10,000 запросов и в целом это работало, хоть и не так быстро. Я решил заменить эту логику на UPSERT. Скрипт выглядит так: Код: sql 1. 2. 3.
Но тут возникла небольшая проблема с serial полем. При каждом запросе INSERT INTO, id serial автоматически инкрементируется, даже если запись не была вставлена. Т.е. последний id в колонке условно был = 1800. Вчера в таблице появилось несколько новых записей с такими id: 2300, 2560, 8120, 9982. Сегодня id уже перевалил за 20,000. Т.е. он пытается сделать INSERT, увеличивает счетчик, не осуществляет вставку, но счетчик не откатывается обратно. Думаю, что через пару месяцев он в конечном итоге упрется в лимит диапазона serial. Скрипт этой последовательности: Код: sql 1. 2. 3. 4. 5. 6. 7.
Можно ли как-то починить это дело? Одно дело, когда просто удаляешь запись из таблицы и айдишник какой-то пропадает. Но тут sequence растет в геометрической прогрессии. Либо возвращаться к старому варианту с проверкой на то, существует ли уже такой section_id. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 10:59 |
|
Sequence инкрементируется, даже если не произошел INSERT
|
|||
---|---|---|---|
#18+
Статья на эту тему PostgreSQL Antipatterns: накручиваем себе проблемы ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 11:03 |
|
Sequence инкрементируется, даже если не произошел INSERT
|
|||
---|---|---|---|
#18+
miroooha, сделайте bigserial/bigint и успокойтесь...его вам на всю жизнь хватит ps: проблема известная и не лечится. pps: insert on conflict do nothing если в 99% случаев этот do nothing делается - таки антипаттерн и так лучше не делать (проверяйте наличие и если не нашли вставляйте но все равно с insert on conflict do nothing - это будет идеально). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 11:15 |
|
|
start [/forum/topic.php?fid=53&fpage=17&tid=1994254]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
72ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 343ms |
total: | 508ms |
0 / 0 |