2016-08-24 4 views
0

У меня есть пустая родительская таблица, наследуемая сотнями дочерних таблиц, все с той же схемой. Детские таблицы соответствуют датам файлов, которые поступают ежедневно. Таблицы имеют индекс, построенный на столбце time (и другие) и представляют данные событий. Ни один ребенок таблица с датой файла t не имеет ряд с time > tОсмотрите блокировки, запрошенные запросом out_of_shared_memory

Я запрашивая родительскую таблицу и получить out_of_shared_memory ошибку, так как количество замков превышает мой max_locks_per_transaction * (max_connections + max_prepared_transactions) предел.

Есть ли способ определить, какие дочерние таблицы и связанные с ними отношения требуют блокировки без его запуска? Или это просто все отношения, которые появляются в EXPLAIN (expr)? Я ограничиваю time не старше 30 дней, что, по моему мнению, уменьшит необходимость блокировки дочерних таблиц с датой файла менее 30 дней назад. Тем не менее, мой план запроса демонстрирует, что сканирование индекса выполняется во всех индексах дочерних таблиц time, поэтому мне интересно, действительно ли они заблокированы после сканирования (предположительно) не возвращают соответствующие строки.

Редактировать: Я должен отметить, что я управляю 9.4 через Amazon RDS. Я знаю, что могу отбросить старые дочерние таблицы, которые мне больше не нужны, или увеличить max_locks_per_transaction, но хотелось бы проверить, есть ли способ сделать мой запрос более умным.

ответ

0

Все таблицы, которые отображаются в вашем плане запроса, будут заблокированы, чтобы их нельзя было отбросить во время выполнения запроса, поэтому большое количество таблиц в плане запроса является причиной ошибки.

Вы создали CHECK ограничения на столбец time, как показано на рисунке in the documentation? Это необходимо для исключения ограничений для работы. Кроме того, параметр constraint_exclusion не должен быть установлен в off.

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

Смежные вопросы