PostgreSQL Error 54011 too_many_columns: Лимиты и Решения
- Ошибка DDL/DML:
ERROR: 54011: tables can have at most 1600 columns. - Ошибка при создании широких временных таблиц:
target lists can have at most 1664 entries. - Сбой реструктуризации метаданных в 1С:Предприятие при добавлении новых реквизитов в крупные документы или справочники.
- Отказ выполнения аналитических запросов с множеством вычисляемых полей.
1. Архитектурные ограничения PostgreSQL на количество колонок
В PostgreSQL действует жесткий фундаментальный предел: не более 1600 столбцов на одну физическую таблицу (фактическое число может быть меньше в зависимости от типов данных из-за лимита заголовка кортежа корзины кортежей).
2. Проблема 'мертвых' (удаленных) колонок (Dropped Columns)
В PostgreSQL при выполнении ALTER TABLE DROP COLUMN колонка не удаляется физически из системного каталога, а лишь помечается как удаленная, продолжая учитываться в общем лимите 1600 столбцов!
Проверьте реальное количество активных и скрытых колонок:
SELECT count(*) AS total_internal_columns,
count(*) FILTER (WHERE NOT attisdropped) AS active_columns,
count(*) FILTER (WHERE attisdropped) AS dropped_columns
FROM pg_attribute
WHERE attrelid = 'my_large_table'::regclass;
3. Очистка удаленных колонок через VACUUM FULL / pg_repack
Чтобы сбросить счетчик удаленных колонок и вернуть структуру к фактическому числу полей, выполните полную перестройку таблицы:
-- Внимание: блокирует таблицу на запись (Exclusive Lock)
VACUUM FULL my_large_table;
-- Альтернатива без длительной блокировки (через утилиту pg_repack):
-- pg_repack -t my_large_table -d enterprise_db
4. Рефакторинг широких таблиц в 1С и реляционных моделях
- Переход на EAV / JSONB: Вынесите редко используемые или динамические реквизиты в одно поле типа
jsonb. - Вертикальное шардирование: Разбейте широкую сущность на две связанные таблицы по первичному ключу 1-к-1 (например,
orders_mainиorders_extended_specs). - Табличные части в 1С: Перенесите избыточные реквизиты шапки документа в подчиненные табличные части.
Частые вопросы (FAQ)
Почему лимит составляет именно 1600 колонок?
Это ограничение заложено в константу MaxTupleAttributeNumber ядра PostgreSQL и связано с размером битовой карты null-значений (Null Bitmap) в заголовке строки на странице памяти 8KB.
Можно ли перекомпилировать PostgreSQL для увеличения лимита колонок?
Теоретически константу можно изменить в исходном коде, но это сломает бинарную совместимость со всеми расширениями, снизит производительность сканирования строк и может привести к повреждению данных.
Как 1С:Предприятие реагирует на превышение лимита колонок?
Платформа выдает ошибку реструктуризации базы данных при обновлении конфигурации. Для исправления требуется удаление неиспользуемых реквизитов и выполнение сжатия таблиц через 'Тестирование и исправление'.
Учитываются ли системные колонки (ctid, xmin, xmax) в этом лимите?
Да, системные атрибуты имеют отрицательные номера и занимают слоты в заголовке кортежа, немного уменьшая максимально доступное число пользовательских полей.