powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Механизм создания FOREIGN KEY
9 сообщений из 9, страница 1 из 1
Механизм создания FOREIGN KEY
    #39950324
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, подскажите пожалуйста где изучить вопрос или может кто то объяснит саму механику СУБД в момент создания FOREIGN KEY.


То есть у меня ситуация такая, Есть три сервера, один боевой, к которому ходят запросы, и два тестовых.

Одна и та же таблица1, 15тыс записей на всех серверах. Добавил новую таблица2 на тестовых серверах, добавил в таблица1 новую колонку. Запустил создание FOREIGN KEY с новой колонки на Таблица2. На тестовых серверах операция выполнялась 6секунд, на боевом операция встала на 20минут. Новая колонка на момент создания внешнего ключа содержит только null значения.


Что поэтапно происходит при создании FOREIGN KEY и что поэтапно происходит при создании FOREIGN KEYна таблицу, к которой при этом периодически выполняются селекты.

Заранее спасибо.
...
Рейтинг: 0 / 0
Механизм создания FOREIGN KEY
    #39950820
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kliff,

блокировка под нагрузкой скорее всего, вот и ждали.
авторAddition of a foreign key constraint requires a SHARE ROW EXCLUSIVE lock on the referenced table, in addition to the lock on the table receiving the constraint.
Ну а по-этапно что тут. База блокирует таблицу, чтобы проверить, что накладываемое ограничение при текущих данных исполняется, поэтому и блокирует и исходную таблицу и "поочередно" строки в той таблице, на которую ссылаемся. Можно указать NOT VALID, но потом все равно требуется INVALIDATE.
Другие детали и подробности читайте в ALTER TABLE или CREATE TABLE - в документации все расписано.
...
Рейтинг: 0 / 0
Механизм создания FOREIGN KEY
    #39950843
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff,

Если совсем кратко -
1)пока ВСЕ запросы и транзакции как использовавшие таблицы с обоеих сторон FK и начавшиеся ДО запуска команды создания FK не закончатся - создание FK повесит локи на таблицы и будет ждать (точнее будет ждать пока сможет эти локи получить)
2)после того как все запросы из п1 завершатся - база будет создавать FK и проверять что он ненарушен
3)Все это время эти таблицы заблокированы для всех запросов кроме запросов указанных в п1
...
Рейтинг: 0 / 0
Механизм создания FOREIGN KEY
    #39952396
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grgdvo
kliff,

блокировка под нагрузкой скорее всего, вот и ждали.
авторAddition of a foreign key constraint requires a SHARE ROW EXCLUSIVE lock on the referenced table, in addition to the lock on the table receiving the constraint.

Ну а по-этапно что тут. База блокирует таблицу, чтобы проверить, что накладываемое ограничение при текущих данных исполняется, поэтому и блокирует и исходную таблицу и "поочередно" строки в той таблице, на которую ссылаемся. Можно указать NOT VALID, но потом все равно требуется INVALIDATE.
Другие детали и подробности читайте в ALTER TABLE или CREATE TABLE - в документации все расписано.

На примере не совсем понятно
в
Предположим миллион записей с null в колонке, на которую вешается fk. Получается СУБД будет фулсканом перебирать все строки таблицы поочередно и все, без сопоставления? Вряд ли он будет по null пытаться искать ключевое значение. И вся работа по идее сводится к селекту всей таблицы?
...
Рейтинг: 0 / 0
Механизм создания FOREIGN KEY
    #39952399
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk
kliff,

Если совсем кратко -
1)пока ВСЕ запросы и транзакции как использовавшие таблицы с обоеих сторон FK и начавшиеся ДО запуска команды создания FK не закончатся - создание FK повесит локи на таблицы и будет ждать (точнее будет ждать пока сможет эти локи получить)
2)после того как все запросы из п1 завершатся - база будет создавать FK и проверять что он ненарушен
3)Все это время эти таблицы заблокированы для всех запросов кроме запросов указанных в п1


Спасибо за ответ.

Можете еще пояснить на пальцах?
К СУБД идут в основном не сильно грузные быстрые запросы. Получается они тоже вешают лок на время своей работы. Тут я навешиваю fk, он ждет пока таблицы разлочатся, вешает свой лок и начинает выполнение. Не очень понимаю, тогда логически разница между сервером без запросов и сервером, куда идут запросы, должна быть только во времени ожидания выполнения этих мелких запросов, они явно не 20-30минут отрабатывают.
А по факту вроде как получается, что fk ждет разлочивания, запускается и вешает лок на 30минут под свои нужды. Хотя на свободном сервере ему хватало нескольких минут. Или fk не лочит полностью таблицу, а позволяет выполняться параллельным процессам?
...
Рейтинг: 0 / 0
Механизм создания FOREIGN KEY
    #39952685
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kliff,

Помониторьте локи, хотя бы элементарно

Код: sql
1.
select * from pg_locks where not granted and relation = <table_oid_here>;



транзакции вполне могут накладываться.
может это немного прояснит ситуацию.
...
Рейтинг: 0 / 0
Механизм создания FOREIGN KEY
    #39952746
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
Maxim Boguk
kliff,

Если совсем кратко -
1)пока ВСЕ запросы и транзакции как использовавшие таблицы с обоеих сторон FK и начавшиеся ДО запуска команды создания FK не закончатся - создание FK повесит локи на таблицы и будет ждать (точнее будет ждать пока сможет эти локи получить)
2)после того как все запросы из п1 завершатся - база будет создавать FK и проверять что он ненарушен
3)Все это время эти таблицы заблокированы для всех запросов кроме запросов указанных в п1


Спасибо за ответ.

Можете еще пояснить на пальцах?
К СУБД идут в основном не сильно грузные быстрые запросы. Получается они тоже вешают лок на время своей работы. Тут я навешиваю fk, он ждет пока таблицы разлочатся, вешает свой лок и начинает выполнение. Не очень понимаю, тогда логически разница между сервером без запросов и сервером, куда идут запросы, должна быть только во времени ожидания выполнения этих мелких запросов, они явно не 20-30минут отрабатывают.
А по факту вроде как получается, что fk ждет разлочивания, запускается и вешает лок на 30минут под свои нужды. Хотя на свободном сервере ему хватало нескольких минут. Или fk не лочит полностью таблицу, а позволяет выполняться параллельным процессам?


Предлагаю на prod удатить fk и сделать заново... если он стабильно ща 20-30 минут отрабатыает вместо 1-2 на тесте - тогда будем смотреть причины.
Запросы даже быстрые вешают лока на таблицу не на время своей работы а до конца транзакции... поэтому begin; быстрый запрос; 20 минут ожидания; commit; - будет держать лок на таблицу эти самые 20 минут что вероятнее всего у вас и произошло.
...
Рейтинг: 0 / 0
Механизм создания FOREIGN KEY
    #39954920
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk
kliff
пропущено...


Спасибо за ответ.

Можете еще пояснить на пальцах?
К СУБД идут в основном не сильно грузные быстрые запросы. Получается они тоже вешают лок на время своей работы. Тут я навешиваю fk, он ждет пока таблицы разлочатся, вешает свой лок и начинает выполнение. Не очень понимаю, тогда логически разница между сервером без запросов и сервером, куда идут запросы, должна быть только во времени ожидания выполнения этих мелких запросов, они явно не 20-30минут отрабатывают.
А по факту вроде как получается, что fk ждет разлочивания, запускается и вешает лок на 30минут под свои нужды. Хотя на свободном сервере ему хватало нескольких минут. Или fk не лочит полностью таблицу, а позволяет выполняться параллельным процессам?


Предлагаю на prod удатить fk и сделать заново... если он стабильно ща 20-30 минут отрабатыает вместо 1-2 на тесте - тогда будем смотреть причины.
Запросы даже быстрые вешают лока на таблицу не на время своей работы а до конца транзакции... поэтому begin; быстрый запрос; 20 минут ожидания; commit; - будет держать лок на таблицу эти самые 20 минут что вероятнее всего у вас и произошло.


Спасибо за ответ. А с чем может потенциально быть связано большое время ожидания закрытия транзакции? Запрос выбрал свои данные, почему он дальше долго ожидает завершения транзакции?
...
Рейтинг: 0 / 0
Механизм создания FOREIGN KEY
    #39954988
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff

Спасибо за ответ. А с чем может потенциально быть связано большое время ожидания закрытия транзакции? Запрос выбрал свои данные, почему он дальше долго ожидает завершения транзакции?


Завершение транзакции задача приложения работающего с базой... за него commit; или rollback; никто вызывать не будет.
И соответственно надо смотреть на приложение, база тут ничего сделать не может кроме как ждать от клиента команды.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Механизм создания FOREIGN KEY
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]