Производительность postgresql с большим количеством таблиц (например, 1 миллион таблиц)? - PullRequest
5 голосов
/ 23 октября 2011

Какое наибольшее количество таблиц может находиться в одной базе данных pgsql, сохраняя при этом хорошую производительность, учитывая, что pgsql сохраняет 1 файл на таблицу в файловой системе и выполняет поиск в pg_catalog для каждого запроса, чтобы выполнить планирование запроса?

EG: pgsql может работать с 1 миллионом таблиц в одной базе данных? Предположим, что используемой файловой системой является ext4, и в каждой таблице содержится очень мало данных, поэтому избыточный размер дискового хранилища не является проблемой. Проблема действительно в (1) влиянии наличия 1 миллиона файлов на файловую систему и (2) влиянии наличия 1 миллиона записей в pg_catalog.

Из этой ветки (2005), http://postgresql.1045698.n5.nabble.com/GENERAL-Maximum-number-of-tables-per-database-and-slowness-td1853836.html - сказано ниже (но я не знаю, насколько это применимо в наши дни):

Бенджамин Арай писал:

Каково текущее максимальное количество таблиц в базе данных? Кроме того, делает Наличие большего количества таблиц замедляет производительность в любом случае?

В большинстве случаев ответ - нет. Однако, как только вы приблизитесь к 6 цифре таблица подсчитывает, pg_catalog оказывается довольно массивным. Проблема в что планировщик запросов должен проверять pg_catalog для каждого запроса, чтобы увидеть, что доступны индексы, какова статистика и распределение значений, и т.д., чтобы построить оптимальный план. В какой-то момент действительно большой pg_catalog может начать перегружать вашу систему.

...

Уильям Ю <[скрытый адрес электронной почты]> пишет:

Бенджамин Арай писал:

Каково текущее максимальное количество таблиц в базе данных? Кроме того, делает Наличие большего количества таблиц замедляет производительность в любом случае?

В большинстве случаев ответ - нет. Однако, как только вы приблизитесь к 6 цифре таблица подсчитывает, pg_catalog оказывается довольно массивным.

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

Ответы [ 3 ]

3 голосов
/ 23 октября 2011

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

Но это отличается от возможных проблемналичие миллиона файлов в файловой системе в целом или с фактическими (не воображаемыми) проблемами с pg_catalog.

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

1 голос
/ 29 сентября 2012

В целом, согласно тем, кого я знаю, кто использовал очень большое количество таблиц (во многих тысячах), накладные расходы на планирование увеличиваются по мере увеличения количества таблиц в БД.Те, кого я знал, у которых была эта проблема, должны были найти решения этой проблемы, но не указали мне, что это были за решения.Что происходит, так это планировщик базы данных, чтобы решить, как лучше всего выполнить запрос, нужно искать информацию на основе таблиц и столбцов, поэтому для этого требуется поиск данных в системных каталогах, которые со временем становятся все более раздутыми.Это влияет на каждый запрос в плановое время.

Основная проблема заключается в том, что при планировании необходимо учитывать данные таблиц (требующих поиска данных в таблицах), а также столбцов и столбцов.Интересно, что pg_class имеет индекс для oid и индекс для relnamespace, но не для relname, и вы не можете его легко создать.Единственные индексы в системных таблицах - это УНИКАЛЬНЫЕ ограничения, и поэтому я не вижу, как, кроме изменения системных каталогов (на уровне источника или предоставления вам разрешения на это), вы можете решить эту проблему.

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

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

tl;dr: ожидайте проблем с производительностью с очень большим количеством таблиц.Будьте готовы проявить творческий подход к их решению.

1 голос
/ 23 октября 2011

Этот блог и вопрос , включая комментарии, пролили немного света на эту проблему.

Чтобы ответить на ваш вопрос: это зависит от части, «при которой сохраняется хорошая производительность». Что вы точно считаете "все еще хорошей производительностью"? А с точно какая нагрузка?

Позвольте мне перефразировать ваш вопрос: сколько зубной боли может перенести человек? Тот же ответ!

Но в обоих случаях реальный вопрос: почему вас это действительно волнует? Лучшее решение в обоих случаях - принять меры, чтобы устранить причину и войти в безболезненное состояние как можно скорее.

...