Миллиард таблиц?!

Автор оригинала: Josh Berkus
  • Перевод
Благодаря презентации Селены Деккельман (Selena Deckelmann) на pgCon, некоторые из нас вовлеклись в дискуссию на тему «Сколько таблиц может теоретически потянуть PostgreSQL». На скорую руку был написан скрипт со смелой надеждой создать один миллиард таблиц следующего вида:

CREATE TABLE tab_### (
   id SERIAL NOT NULL PRIMARY KEY,
   value TEXT NOT NULL
);


Необходимо отметить, что такая конструкция помимо всего прочего создаст по миллиарду последовательностей (sequences), индексов, ограничений (constraints), и два миллиарда полей.

Скрипт на Perl был запущен на облачном хостинге GoGrid в 4 параллельных процессах. Он работал вполне сносно, плодя около 300 000 таблиц в час, до тех пор пока место на диске не закончилось.

Исходя из того, что 100 000 пустых таблиц отнимает почти 2GB дискового пространства, после создания почти 3 миллионов таблиц к серверу пришел небезызвестный северный пушной зверек. Да такой, что запустить PostgreSQL удалось только, если отключить fsync:

fsync=off

Кто бы мог подумать…

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

Прим. переводчика: Последовательности будут автоматически созданы для SERIAL полей, индексы же будут созданы для PRIMARY KEY ограничений. Но это еще не все. В виду того, что второе поле имеет тип TEXT, сервер создаст для каждой таблицы еще и TOAST таблицу вместе с уникальным индексом.

В комментариях к исходной статье приводились такие математические выкладки. Каждая таблица на самом деле тянет за собой создание 5 объектов: сама таблица, последовательность, индекс, таблица TOAST, индекс на таблице TOAST. Каждая такая группа отъедает на диске 24KB (3 x 8 + 2 x 0). Даже игнорируя размер системного каталога, такое количество объектов займет 22.3TB.

Если добавить к этому размер системного каталога, то размер увеличится на 12TB и составит 34TB.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 53

    +12
    В каком страшном мире мы живём… XD
    По мне, так тема относится больше к юмору (без понятия, для какой задачи может понадобиться миллиард пустых таблиц, да и вобще, хотя-бы тысяча).
    Самое интересное было бы замерить скорость работы этого безумия после создания тучи таблиц… хмм… придётся проверить, заодно поиздевавшись над MySQL, MSSQL… эм… Оракл и ДБ2 на работе под такое извращение погонять не дадут, а дома лень ставить…
      +5
      Задача и вправду пузомерная, однако в процессе решения мы знакомимся с внутренним устройством системы хранения.
        +3
        Тысяча, кстати, вполне может быть при попытке реализации на SQL чего-то вроде schema free — основная таблица для сущностей с id и другими обязательными атрибутами, и по таблице для каждого необязательного атрибута. И у такого решения есть свои плюсы по сравнению с таблицей в 1000+ столбцов, допускающих NULL. А уж если это публичный сервис, предоставляющий возможность создавать свои атрибуты или новые типы сущностей пользователям, то за 1000 перевалит быстро.
          +1
          для таких случаев есть EAV — количество таблиц равно количеству типов атрибутов
            0
            Тоже вариант, но и свои минусы есть. В частности запросы сложнее.
          +1
          Работал на проекте 1500 постгресовских таблиц. Думаю, это был средний проект.
          Все зависит от архитектуры, много таблиц могут быть служебными, резервными и т.д.
          Иногда делают копию таблицы, а старую переименовывают и меткой даты (эдакая версионность). В итоге число таблиц растет очень быстро.
            0
            Сформировалась последнее время такая привычка: всё что не нужно — постепенно выносить подальше, не особо важно, в архивную подсистему, на базу дев ветки, просто в файлы… Жаль только, что когда разрабатывал на постгресе, с запросами между базами были проблемки.

            Так что под 1000 таблиц в фразе «не знаю задачи, для которой может понадобиться 1000 таблиц» следует понимать 1000 реально необходимых для работы таблиц.
            Сейчас занят на проекте, который развивается с 90ых годов в масштабах небольшой страны и не может быть остановлен больше, чем на час технического перерыва(вру, конечно, когда-то случалось и 2 дня простоя, но воплей, по слухам, было море). Если бы эту базу DB2 не чистили, боюсь, пришлось бы намного чаще обновлять и распараллеливать и сам мейнфрейм(сейчас zSystem 9, если не соврал), и стойку с дисками под базу, и подчинённые системы.

            Это всё — вопросы оптимизации, прилежности админа, следящего за системой, и немного — методки подсчётов.
            В рабочей подсистеме (а существуют ещё и тестовая, и промежуточная, и пара подсистем для вообще других целей) там существуют 1600+ таблиц… примерно 700 из них — явный мусор, аналог вашей «версионности», если хорошо покопаться — у проекта останется 744 актуальные таблицы, может, меньше.
            Теперь, можно смело заявить, по Вашей версии, мол, «проект использует 3500+ таблиц, ура-ура-ура!»(чёрт знает, насколько соврал, лень считать базы дочерних систем, в том числе на других машинах, в других городах), или перекинуть всё лишнее из продакшен подсистемы в архив, исключив мусор из подсчёта и остановиться на скромной цифре в 744.
            Как вариант — провести глубокую оптимизацию и рефакторинг, что почти нереально в нашей ситуации, и оставить таблиц 400-600.

            Вариант VolCh мне показался более разумным, чтоли… Хотя и со своей толикой безумности, а-ля «создадим архитектуру, универсальную для описания всего». :)
            Жаль, ни разу ещё не видел необходимости и не встречал людей, горящих идеей свести базу к 5NF или DKNF… а было бы интересно…
              0
              Моя схема не единственная для описания всего :) Но в свое время для порядка 100 атрибутов выбрал её.
          +8
          Поздравим автора, эксперимент по запуску сферического коня в вакууме прошел успешно!
            +77
            Надо поздравить автора «домашнего хранилища на 90терабайт», нашлось применение его девайсу.
              +14
              Минусующим — статья неполная, потому что не дан ответ на вопрос «Возможно ли создать миллиард таблиц в PostgreSQL ?». Да, автор упёрся в ограничения памяти, но это не проблема PostgreSQL.

              В общем не торт.
                +3
                Ну, а разве теоретически вычисленное значение в 34TB не является ценной информацией, пусть и не подтвержденной в действительности?
              +9
              Не дай бог вручную обращаться ко всем этим таблицам. Уже вижу 100500 join. :)
                –2
                По моему вы с ноликами ошиблись :)
                +13
                Не хватает бенчмарка: посгрес, мускуль, sqlite, и оракель, кто быстрее, кто меньше сожрет диска, замеры с 1,2,4..128 потоков создания и красивыми графиками.
                  +6
                  в блоге DIY ( habrahabr.ru/blogs/DIY/119827/ ) opium собирает файлохранилище на 90 ТБ, как закончит можно его попросить попробовать)
                    +10
                    Миллиард таблиц не удалось создать поскольку кончилось место на жестком диске? Я ждал более интересного ответа :)
                      +2
                      Создали миллиард таблиц, а потом упал скайп, например :)
                      +12
                      >на облачном хостинге GoGrid
                      >…
                      >почти 3 миллионов таблиц к серверу пришел небезызвестный северный пушной зверек

                      вопрос: в чем же облачность этого хостинга? или теперь хостинг без приставки «облачный» уже не воспринимается потенциальными клиентами?
                        +6
                        >или теперь хостинг без приставки «облачный» уже не воспринимается потенциальными клиентами?
                        еще 1 наконец понял.
                          +16
                          Уж не знаю, перевел как есть. Меня раздражают нынче два слова: «Облако» и «Стартап».
                            +9
                            В список раздражителей — еще бы добавил много слов с приставкой «i»
                              +1
                              Ну, уже не так. Ждем новой волны.
                            0
                            Скоро добавится «Skype».
                          0
                          Странно. Только что для проверки запустил цикл на создание пустых таблиц. Для начала ограничился 100 000. Уже создано чуть больше 600 таблиц и весит все это добро чутьбольше 8Мб
                            +3
                            Не верьте своим глазам — они вас обманывают
                              0
                              Уже 10 000 таблиц и 140Мб занято
                                +5
                                Если будет идти такими темпами, то выйдет 140Мб / 10^4 * 10^9 = 14Тб примерно, и более 7 лет.
                                  0
                                  Для миллиарда посчитал.
                                  0
                                  Это значит, что 100 000 таблиц будут занимать почти полтора гигабайта. Хоть и меньше, чем у автора статьи, но не настолько уж, чтобы не верить своим глазам.
                                +1
                                А скажите-ка:

                                1. Чему у вас равны параметры fsync, synchronous_commit, full_page_writes?
                                2. Параметры системы и PostgreSQL сервера;
                                3. Ну и сам цикл (может даже исходники?).
                                  +1
                                  Прошу прощения:

                                  2. Что за OS и версия сервера…
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  +16
                                  У меня как раз воду горячую отключили…
                                    0
                                    блин, не в ту тему
                                      +1
                                      Поделитесь, пожалуйста, секретом, как можно _случайно_ написать комментарий не на ту статью?
                                        +1
                                        Легко… открываешь две темы в соседних вкладках. Обе темы уже далеко не на названии топика… ты уже готов написать комент, но тебя отвлекают и ты через полчаса вспоминаешь что хотел что-то написать. Открываешь и пишешь. Причем я только через 6 минут сообразил что у меня еще одна вкладка была открыта.
                                          +2
                                          Самое интересное то, что этот комментарий является полным бредом в это теме и уместен в той, но здесь он набрал гораздо больше плюсов… Видимо тем, кто занимается постгресом эта проблема ближе и роднее чем тем кто занимается стартапами :)
                                        +2
                                        Про скайп небось? ;)
                                          +3
                                          Неа, про три месяца в испании стартаперам :)
                                        +1
                                        Даешь каждому человеку по таблице!
                                        хмм… интересно, небесная канцелярия какую базёнку использует?
                                          +1
                                          ИМХО, нереляционную
                                            0
                                            ООБД, скорее всего.
                                            +2
                                            Конечно же Облачную!
                                            0
                                            Интересно, а есть ли какое-то ограничение на количество записей в таблице? Меня всегда интересовало, каким образом хранят данные всякие твиттеры, фейсбуки и прочие…
                                              0
                                              Конечно есть. Была где-то статья про то как твиттер упёрся в ограничение индекса и как они эту проблему решили.
                                                0
                                                А не подскажете, в какую сторону рыть на эту тему? Не могу сходу нагуглить.
                                                  0
                                                  Спасибо, офигенная подборка!
                                                0
                                                Я один не понял зачем потребовался хостинг? На локалхосте этого не было сделать? Ограничения бы хоть после пары гигов не было. Кто-то писал не так давно про домашний мультитерабайтный файлсервер, там вроде были искомые 34 ТБ, можно продолжить эксперимент
                                                  0
                                                  Вы наверное не так поняли. Автору таки удалось наплодить 3 мильйона таблиц, а это много болеше 2Гб

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                Самое читаемое