Какие операции выполняются O (n) на количестве таблиц в PostgreSQL? - PullRequest
0 голосов
/ 24 февраля 2020

Скажем теоретически, у меня есть база данных с абсурдным количеством таблиц (более 100 000). Приведет ли это к каким-либо проблемам с производительностью? При условии, что большинство запросов (99% +) будут выполняться только для 2-3 таблиц одновременно.

Поэтому мой вопрос таков:

Какие операции O (n) над числом таблиц в PostgreSQL?

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

pg_dump и pg_restore и pg_upgrade на самом деле хуже, чем O (N ^ 2). Раньше это была огромная проблема, хотя в последних версиях константа этого N ^ 2 была уменьшена до такой низкой, что для 100 000 таблиц этого, вероятно, недостаточно, чтобы быть вашей самой большой проблемой. Однако есть и худшие случаи, например, для таблиц дампа может быть O (M ^ 2) (может быть, M ^ 3, точные детали я больше не помню) для каждой таблицы, где M - количество столбцов в таблице. Это применимо только тогда, когда столбцы имеют проверочные ограничения или значения по умолчанию или другую дополнительную информацию помимо имени и типа. Все эти проблемы особенно неприятны, когда у вас нет проблем с эксплуатацией, чтобы предупредить вас, но вдруг обнаруживается, что вы не можете выполнить обновление в течение разумного периода времени.

Некоторые физические методы резервного копирования, такие как barman с использованием rsync также равны O (N ^ 2) в количестве файлов, что, по крайней мере, равно количеству таблиц.

Во время обычной работы сборщик статистики может стать большим узким местом. Каждый раз, когда кто-то запрашивает обновленную статистику для некоторой таблицы, он должен записать файл, охватывающий все таблицы в этой базе данных. Записать это - O (N) для таблиц в этой базе данных. (Раньше было хуже, выписывая один файл для экземпляра while, а не только базу данных). Это может быть еще хуже в некоторых файловых системах, которые при переименовании одного файла поверх существующего неявно синхронизируют файл, поэтому размещение его в ОЗУ dis c может как минимум улучшить это.

Автовакуум работает над каждой таблицей (примерно один раз за время autovacuum_naptime), чтобы решить, нужно ли их пылесосить, поэтому огромное количество таблиц может замедлить это. Это также может быть хуже, чем O (N), потому что для каждой таблицы есть вероятность, что она запросит обновленную статистику по ней. Хуже того, он может при этом блокировать всех одновременных работников автоочистки (эта последняя часть исправлена ​​в бэк-патче для всех поддерживаемых версий).

Другая проблема, с которой вы можете столкнуться, заключается в том, что каждый сервер базы данных поддерживает кэш метаданных в каждой таблице. (или другой объект) он получил доступ в течение своей жизни. Механизм для истечения срока действия этого кэша отсутствует, поэтому, если каждое соединение касается огромного количества таблиц, оно начнет занимать много памяти и по одной копии для каждого бэкэнда, поскольку оно не используется совместно. Если у вас есть диспетчер соединений, который держит соединения открытыми на неопределенный срок, это может действительно сложиться, поскольку каждое соединение живет достаточно долго, чтобы касаться многих таблиц.

0 голосов
/ 24 февраля 2020

pg_dump с некоторыми опциями, вероятно -s. Некоторые другие параметры делают его более зависимым от размера данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...