Каково максимальное количество столбцов в запросе на выборку PostgreSQL?

Знаете ли вы, какое максимальное количество столбцов можно запросить в Postgresql? Мне нужно знать это, прежде чем я начну свой проект.


person Luke101    schedule 26.09.2012    source источник
comment
Возможный дубликат: stackoverflow .com/questions/12155777/   -  person mawburn    schedule 26.09.2012
comment
Мне редко нужно помещать в таблицу большое количество столбцов. Никак не обойти это, не причинив серьезной боли.   -  person Luke101    schedule 26.09.2012
comment
Несмотря на то, что проблемы проектирования баз данных вызывают большие подозрения, это все же актуальный вопрос. Связанный совет не может заменить ответ.   -  person Erwin Brandstetter    schedule 27.09.2012
comment
Вам нужно, чтобы каждый из них был уникальным столбцом? Могут ли здесь помочь сериализованные данные или массивы?   -  person Scott Marlowe    schedule 27.09.2012
comment
Добавление к комментарию @Scott: .. или, может быть, hstore?   -  person Erwin Brandstetter    schedule 27.09.2012
comment
Собственно, да - мне понадобятся отдельные столбцы. Я буду импортировать тысячи файлов CSV в таблицы для анализа. Некоторые файлы CSV имеют много столбцов. Кроме того, для некоторых столбцов целых чисел и дат потребуются индексы.   -  person Luke101    schedule 27.09.2012


Ответы (3)


В соответствии с Ограничениями PostgreSQL это "250–1600 в зависимости от типов столбцов". См. примечание под таблицей. Типы столбцов влияют на это, потому что в PostgreSQL строки могут иметь ширину не более 8 КБ (одна страница), они не могут занимать страницы. Большие значения в столбцах — это нормально, потому что TOAST обрабатывает это, но существует ограничение на количество столбцов, которые вы можете поместить, это зависит от того, насколько широки используемые типы данных без TOAST.

(Строго это относится к столбцам, которые могут храниться в строках на диске; запросы могут использовать более широкие наборы столбцов, чем это. Я не рекомендую полагаться на это.)

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

Сопоставление электронных таблиц с реляционными базами данных кажется самой простой вещью в мире — сопоставьте столбцы со столбцами, строки со строками и вперед. Верно? На самом деле электронные таблицы — это огромные монстры произвольной формы, которые не навязывают никакой структуры и могут быть очень громоздкими. Реляционные базы данных предназначены для обработки намного большего количества строк, но за это приходится платить; в случае PostgreSQL часть этой стоимости является ограничением ширины строк. При работе с электронными таблицами, созданными Джо Юзером, это может стать настоящей проблемой.

Одно «решение» состоит в том, чтобы разложить их на EAV, но работать с этим невыразимо медленно и некрасиво. Лучшими решениями являются использование массивов, где это возможно, составных типов, hstore, json, xml и т. д.

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

person Craig Ringer    schedule 27.09.2012
comment
Вау... Я очень хорошо знаком с сервером sql и впервые использую postgresql. Я понятия не имел, что в базе данных есть hstore и json. Вы дали мне хорошую идею решить другую проблему, используя эти типы данных. Я вижу, что postgresql — мощный инструмент. - person Luke101; 27.09.2012
comment
Кстати, в Postgres 9.4 появятся основные новые функции для поддержки JSON. Доступно сейчас в виде бета-версии. Поддержка XML уже превосходна. А у Postgres была поддержка пар ключ-значение (hstore) задолго до того, как был придуман ярлык No-SQL. Действительно мощный. - person Basil Bourque; 19.10.2014

Для тех, кто может найти эту информацию полезной, ответ 1663 в зависимости от типов столбцов, соответствующих этому сообщению http://archives.postgresql.org/pgsql-admin/2008-05/msg00208.php

person Luke101    schedule 26.09.2012

При использовании типа JSON/JSONB почти нет необходимости иметь очень много столбцов в таблице.

И в редких случаях, если бы вы достигли максимального предела столбцов вашей системы базы данных, возможно, вы могли бы использовать реализацию электронной таблицы в РСУБД с таблицей, подобной следующей:

create table wide_table(
id serial not null primary key
,rownum integer not null
,colnum integer not null
,colname varchar(30) not null
,coltype varchar(30) not null
,nullable boolean   not null
,collen  integer
,colprec integer
,colscale integer
,colvalue raw(2000)
,unique (rownum,colnum)
);

Это позволило бы использовать практически неограниченное количество столбцов, но его использование было бы менее тривиальным.

person Rob Heusdens    schedule 01.02.2017