【发布时间】:2020-11-09 00:44:10
【问题描述】:
所以我有一个(记录的)表,其中包含 A、B 两列,其中包含文本。 它们基本上包含相同类型的信息,因为数据来自哪里,所以只有两列。
我想要一个包含所有唯一值的表(所以我将列设为主键),而不关心列。但是当我要求 postgres 做时
insert into new_table(value) select A from old_table on conflict (value) 什么都不做; (稍后对 B 列进行同样的操作)
它使用 1 个 cpu 核心,并且仅以大约 5 MB/s 的速度从我的 SSD 读取数据。几个小时后我停止了它。
我怀疑这可能是因为 b-tree 很慢,所以我在新表的唯一属性上添加了一个 hashindex。但它仍然最大程度地使用 1 个核心,并以每秒 5 MB/s 的速度从 ssd 读取数据。我的 java 程序可以设置至少 150 MB/s,所以 postgres 应该比 5 MB/s 快,对吧?我已经分析了我的旧表,并为我的新表取消了记录以便更快地插入,但它仍然使用 1 个核心并且读取速度非常慢。
如何解决这个问题?
编辑:这是对上述查询的解释。似乎 postgres 正在使用它为主键创建的 b-tree 而不是我的(快得多,不是吗??)哈希索引。
Insert on users (cost=0.00..28648717.24 rows=1340108416 width=14)
Conflict Resolution: NOTHING
Conflict Arbiter Indexes: users_pkey
-> Seq Scan on games (cost=0.00..28648717.24 rows=1340108416 width=14)
【问题讨论】:
标签: postgresql performance indexing unique