|
Механизм создания FOREIGN KEY
|
|||
---|---|---|---|
#18+
Ребята, подскажите пожалуйста где изучить вопрос или может кто то объяснит саму механику СУБД в момент создания FOREIGN KEY. То есть у меня ситуация такая, Есть три сервера, один боевой, к которому ходят запросы, и два тестовых. Одна и та же таблица1, 15тыс записей на всех серверах. Добавил новую таблица2 на тестовых серверах, добавил в таблица1 новую колонку. Запустил создание FOREIGN KEY с новой колонки на Таблица2. На тестовых серверах операция выполнялась 6секунд, на боевом операция встала на 20минут. Новая колонка на момент создания внешнего ключа содержит только null значения. Что поэтапно происходит при создании FOREIGN KEY и что поэтапно происходит при создании FOREIGN KEYна таблицу, к которой при этом периодически выполняются селекты. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 09:56 |
|
Механизм создания FOREIGN KEY
|
|||
---|---|---|---|
#18+
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 - в документации все расписано. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2020, 09:32 |
|
Механизм создания FOREIGN KEY
|
|||
---|---|---|---|
#18+
kliff, Если совсем кратко - 1)пока ВСЕ запросы и транзакции как использовавшие таблицы с обоеих сторон FK и начавшиеся ДО запуска команды создания FK не закончатся - создание FK повесит локи на таблицы и будет ждать (точнее будет ждать пока сможет эти локи получить) 2)после того как все запросы из п1 завершатся - база будет создавать FK и проверять что он ненарушен 3)Все это время эти таблицы заблокированы для всех запросов кроме запросов указанных в п1 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2020, 10:20 |
|
Механизм создания FOREIGN KEY
|
|||
---|---|---|---|
#18+
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 пытаться искать ключевое значение. И вся работа по идее сводится к селекту всей таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2020, 15:19 |
|
Механизм создания FOREIGN KEY
|
|||
---|---|---|---|
#18+
Maxim Boguk kliff, Если совсем кратко - 1)пока ВСЕ запросы и транзакции как использовавшие таблицы с обоеих сторон FK и начавшиеся ДО запуска команды создания FK не закончатся - создание FK повесит локи на таблицы и будет ждать (точнее будет ждать пока сможет эти локи получить) 2)после того как все запросы из п1 завершатся - база будет создавать FK и проверять что он ненарушен 3)Все это время эти таблицы заблокированы для всех запросов кроме запросов указанных в п1 Спасибо за ответ. Можете еще пояснить на пальцах? К СУБД идут в основном не сильно грузные быстрые запросы. Получается они тоже вешают лок на время своей работы. Тут я навешиваю fk, он ждет пока таблицы разлочатся, вешает свой лок и начинает выполнение. Не очень понимаю, тогда логически разница между сервером без запросов и сервером, куда идут запросы, должна быть только во времени ожидания выполнения этих мелких запросов, они явно не 20-30минут отрабатывают. А по факту вроде как получается, что fk ждет разлочивания, запускается и вешает лок на 30минут под свои нужды. Хотя на свободном сервере ему хватало нескольких минут. Или fk не лочит полностью таблицу, а позволяет выполняться параллельным процессам? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2020, 15:31 |
|
Механизм создания FOREIGN KEY
|
|||
---|---|---|---|
#18+
kliff, Помониторьте локи, хотя бы элементарно Код: sql 1.
транзакции вполне могут накладываться. может это немного прояснит ситуацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2020, 07:48 |
|
Механизм создания FOREIGN KEY
|
|||
---|---|---|---|
#18+
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 минут что вероятнее всего у вас и произошло. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2020, 11:02 |
|
Механизм создания FOREIGN KEY
|
|||
---|---|---|---|
#18+
Maxim Boguk kliff пропущено... Спасибо за ответ. Можете еще пояснить на пальцах? К СУБД идут в основном не сильно грузные быстрые запросы. Получается они тоже вешают лок на время своей работы. Тут я навешиваю fk, он ждет пока таблицы разлочатся, вешает свой лок и начинает выполнение. Не очень понимаю, тогда логически разница между сервером без запросов и сервером, куда идут запросы, должна быть только во времени ожидания выполнения этих мелких запросов, они явно не 20-30минут отрабатывают. А по факту вроде как получается, что fk ждет разлочивания, запускается и вешает лок на 30минут под свои нужды. Хотя на свободном сервере ему хватало нескольких минут. Или fk не лочит полностью таблицу, а позволяет выполняться параллельным процессам? Предлагаю на prod удатить fk и сделать заново... если он стабильно ща 20-30 минут отрабатыает вместо 1-2 на тесте - тогда будем смотреть причины. Запросы даже быстрые вешают лока на таблицу не на время своей работы а до конца транзакции... поэтому begin; быстрый запрос; 20 минут ожидания; commit; - будет держать лок на таблицу эти самые 20 минут что вероятнее всего у вас и произошло. Спасибо за ответ. А с чем может потенциально быть связано большое время ожидания закрытия транзакции? Запрос выбрал свои данные, почему он дальше долго ожидает завершения транзакции? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 11:29 |
|
Механизм создания FOREIGN KEY
|
|||
---|---|---|---|
#18+
kliff Спасибо за ответ. А с чем может потенциально быть связано большое время ожидания закрытия транзакции? Запрос выбрал свои данные, почему он дальше долго ожидает завершения транзакции? Завершение транзакции задача приложения работающего с базой... за него commit; или rollback; никто вызывать не будет. И соответственно надо смотреть на приложение, база тут ничего сделать не может кроме как ждать от клиента команды. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 15:20 |
|
|
start [/forum/topic.php?fid=53&msg=39950843&tid=1994694]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 294ms |
total: | 426ms |
0 / 0 |