我有一个 PostgreSQL 表。select *
很慢,但又select id
好又快。我认为可能是行的大小非常大并且需要一段时间来运输,或者可能是其他一些因素。
我需要所有字段(或几乎所有字段),因此仅选择一个子集不是一个快速解决方案。选择我想要的字段仍然很慢。
这是我的表架构减去名称:
integer | not null default nextval('core_page_id_seq'::regclass)
character varying(255) | not null
character varying(64) | not null
text | default '{}'::text
character varying(255) |
integer | not null default 0
text | default '{}'::text
text |
timestamp with time zone |
integer |
timestamp with time zone |
integer |
Run Code Online (Sandbox Code Playgroud)
文本字段的大小可以是任意大小。但是,在最坏的情况下,不会超过几千字节。
postgresql performance size disk-space postgresql-performance
我们处理来自客户的常规数据馈送,该客户刚刚将其数据库从一种看起来很熟悉的表单(每个实体一行,每个属性一列)重构为一个我似乎不熟悉的表单(每个实体每个属性一行):
之前:每个属性一列
ID Ht_cm wt_kg Age_yr ...
1 190 82 43 ...
2 170 60 22 ...
3 205 90 51 ...
Run Code Online (Sandbox Code Playgroud)
之后:所有属性的一列
ID Metric Value
1 Ht_cm 190
1 Wt_kg 82
1 Age_yr 43
1 ...
2 Ht_cm 170
2 Wt_kg 60
2 Age_yr 22
2 ...
3 Ht_cm 205
3 Wt_kg 90
3 Age_yr 51
3 ...
Run Code Online (Sandbox Code Playgroud)
这个数据库结构有名字吗?有哪些相对优势?旧方法似乎更容易对特定属性(非空、非负等)设置有效性约束,并且更容易计算平均值。但是我可以看到在不重构数据库的情况下添加新属性可能会更容易。这是构建数据的标准/首选方式吗?
我有一个包含五个布尔列的表。在 90% 以上的行中,所有列都为空。(False
相当于null
我。)
我可以有一个包含枚举自定义数据类型数组的单个数组列,而不是具有布尔列,从而仅存储非空的列。
我觉得使用数组很奇怪,但我的同事向我指出,并没有真正强烈的理由反对使用它们,而且我们实际上可能会看到使用它们的节省,因为我们没有存储一堆空列。
使用数组有什么缺点吗?具体来说:它们会占用更多空间,占用更多时间进行查询,还是阻止使用 Postgres 功能(例如 gin 索引)?
performance ×2
postgresql ×2
array ×1
datatypes ×1
disk-space ×1
eav ×1
ontology ×1
schema ×1
size ×1