|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
Есть задача пересоздать таблицу с 1 млрд строк с минимальным простоем. Я придумал навесить на старую таблицу триггер, который будет обновлять или добавлять данные в новой таблице при изменении данных в старой и после этого пакетно копировать данные из старой таблицы в новую. В таблице есть индексированное поле created_at (дата вставки записи) и я решил использовать его для разбиения строк на пакеты и копировать данные по одному дню. Для того, чтобы процесс можно было распараллелить я создал табличку, в которую записывается дата, данные за которую сейчас переносятся. На момент вставки в эту таблицу берётся advisory lock и освобождается сразу же после вставки. Заодно логируется некоторая элементарная статистика. Процедура выглядит следующим образом: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Проблема в том, что если запустить процедуру в двух параллельных транзакциях, одна из транзакций начинает висеть в ожидании, пока не закончится первая. И судя по pg_locks проблема не в advisory locks. Я не понимаю, откуда вообще берётся блокировка при вставке. Может, знающие умы что-нибудь дельное посоветуют? Где и что я упустил? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 16:37 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
Судя по логам, блокировка возникает при вставке в индекс, навешенный на новую таблицу. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 16:49 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
bff7755aЕсть задача пересоздать таблицу с 1 млрд строк с минимальным простоем. А какая задача изначальная? Может, банальный pg_repack? bff7755aЯ не понимаю, откуда вообще берётся блокировка при вставке Уникальные индексы есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 17:07 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
MelkijА какая задача изначальная? Может, банальный pg_repack? Изначально вакуум работает по таблице очень долго (больше недели), было установлено, что в версиях 9.5.* до 9.5.15 есть баг, когда вакуум работает бесконечно если на таблице есть битые индексы, но обновление до 9.5.15 не помогло, поэтому решили перенести таблицу, так как xid не бесконечный и до wraparound осталось около 1 млрд транзакций. bff7755aЯ не понимаю, откуда вообще берётся блокировка при вставке Уникальные индексы есть?[/quot] Есть, PK по id. Это поле типа uuid (к сожалению). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 17:16 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
bff7755a, ну вот pg_repack и воспользуйтесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 17:42 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
Melkijbff7755a,ну вот pg_repack и воспользуйтесь. У меня есть подозрения, что с таблицей (или индексами на ней) что-то не то. Стороннее расширение тоже не факт что с этим справится, поэтому выбрали гарантированный вариант. А вопрос всё-таки был про блокировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 17:46 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
И, кстати, pg_repack замораживает строки? Иначе в моём случае он будет бесполезен. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 17:50 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
bff7755aИ, кстати, pg_repack замораживает строки? Иначе в моём случае он будет бесполезен. Прочитал документацию. Он пересоздаёт таблицу на самом деле, так что всё OK. Можно попробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 18:07 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
bff7755a, pg_repack делает копию таблицы через insert select, строит индексы, нагоняет diff который записал триггером, затем подменяет relfilenode и прочие зависимости, relfrozenxid тоже обновляет. Потому что все данные были скопированы только что. И это сильно быстрее и надёжнее, чем вы сейчас будете отлаживать в спехе аналогичный велосипед. bff7755aА вопрос всё-таки был про блокировки. Так на уникальных индексах и стоите вероятно. Где-нибудь из package_catchup_log ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 18:19 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
Melkij, есть только одна проблема. Уже работает prevent wraparound vacuum. А с ним у pg_repack похоже бывают некотрые конфликты ( https://github.com/reorg/pg_repack/issues/148). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 18:30 |
|
Блокировки при вставке в таблицу
|
|||
---|---|---|---|
#18+
bff7755a, create index concurrently pg_repack делает если запросили пересборку только индексов --only-indexes В этом случае логика работы в принципе по другому пути идёт и сама таблица никак не затрагивается. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 19:01 |
|
|
start [/forum/topic.php?fid=53&msg=39741721&tid=1995453]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
58ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 268ms |
total: | 423ms |
0 / 0 |