【发布时间】:2012-08-01 06:21:08
【问题描述】:
假设我们有一个包含 600 万条记录的表。有 16 个整数列和几个文本列。它是只读表,因此每个整数列都有一个索引。 每条记录大约 50-60 字节。
表名是“项目”
服务器是:12 GB RAM,1,5 TB SATA,4 个核心。用于 postgres 的所有服务器。
此数据库中有更多表,因此 RAM 无法覆盖所有数据库。
我想在表“Item”中添加一列“a_elements”(大整数的数组类型) 每条记录在此列中的元素不超过 50-60 个。
之后我会在这个列上创建索引 GIN,典型的查询应该是这样的:
select * from item where ...... and '{5}' <@ a_elements;
我还有第二个更经典的选择。
不要将列 a_elements 添加到表项,而是创建具有两列的表元素:
- id_item
- id_element
此表将有大约 2 亿条记录。
我能够对这些表进行分区,因此表元素中的记录数将减少到 2000 万,表项中的记录数将减少到 500 K。
第二个选项查询如下所示:
select item.*
from item
left join elements on (item.id_item=elements.id_item)
where ....
and 5 = elements.id_element
我想知道从性能的角度来看哪个选项会更好。 postgres 是否能够在单个查询中使用带有索引 GIN(选项 1)的许多不同索引?
我需要做出正确的决定,因为导入这些数据需要 20 天时间。
【问题讨论】:
标签: arrays performance postgresql join bigdata