50

你知道Postgresql最多可以查询多少列吗?在我开始我的项目之前,我需要知道这一点。

4

3 回答 3

59

根据PostgreSQL 限制,它是“250 - 1600 取决于列类型”。见表下注。列类型会影响它,因为在 PostgreSQL 中,行可能最多 8kb(一页)宽,它们不能跨页。列中的大值是可以的,因为 TOAST 可以处理这个问题,但是您可以容纳多少列是有限制的,这取决于所使用的未 TOAST 数据类型的宽度。

(严格来说,这指的是可以存储在磁盘行中的列;查询可能能够使用比这更宽的列集。我不建议依赖它。)

如果您甚至考虑接近列限制,您可能会遇到问题。

将电子表格映射到关系数据库似乎是世界上最简单的事情 - 将列映射到列,将行映射到行,然后就可以了。对?实际上,电子表格是巨大的自由形式怪物,不强制执行任何结构,并且非常笨重。关系数据库旨在处理更多行,但要付出代价;在 PostgreSQL 的情况下,部分成本是限制它喜欢这些行的宽度。当面对 Joe User 创建的电子表格时,这可能是一个真正的问题。

一种“解决方案”是将它们分解为EAV,但使用起来非常缓慢和丑陋。更好的解决方案是尽可能使用数组、复合类型hstore、、json、xml 等。

但最后,有时最好的答案是使用电子表格分析电子表格。

于 2012-09-27T00:08:27.587 回答
9

对于可能发现此信息有用的其他人,答案是 1663,具体取决于此帖子 http://archives.postgresql.org/pgsql-admin/2008-05/msg00208.php的列类型

于 2012-09-26T17:54:28.633 回答
0

使用 JSON/JSONB 类型,几乎不需要一个表中有很多列。

在极少数情况下,如果您要达到数据库系统的最大列限制,也许您可​​以使用电子表格的 RDBMS 实现,其表如下所示:

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)
);

这将允许几乎无限数量的列,但使用它会不那么简单。

于 2017-02-01T22:27:53.737 回答