我尝试填写表“SAMPLE”,需要来自其他三个表的ID。 需要填写的表“SAMPLE”看起来如下:
当前查询如下所示:
insert into SAMPLE(system_id, manufacturer_id, code, subsystem_id)
values ((select id from system where initial = 'P'), (select id from manufacturer where name = 'nameXY'), 'P0001', (select id from subsystem where code = 'NAME PATTERN'));
速度非常慢,大约一分钟插入8k行。 我不确定这是否是真正错误的查询问题,或者我的postgres配置是否严重搞乱。
为了澄清,更多表格信息: 的子系统:
系统
制造商
“SAMPLE”表将是这些表之间的唯一连接,因此我不确定是否可以使用连接。
我很确定8k值应该是插入数据库的一个巨大的笑话所以我真的很困惑。
我的规格: 赢7 x86_64 8GB RAM intel i5 3470S(QUAD)2,9 GHZ Postgres是v9.3
我在查询过程中没有看到任何高峰,所以我怀疑我的配置有问题。如果您需要有关它的信息,请告诉我。
注意:我可能在子系统或制造商表中找不到代码或名称。我没有添加任何内容,而是想在单元格中添加NULL值。
答案 0 :(得分:0)
我无法测试它,因为我没有安装PostgreSql,也没有类似结构的数据库,但从单个语句中获取插入数据可能会更快
INSERT INTO Sample (system_id, manufacturer_id, code, subsystem_id)
SELECT s.id AS system_id,
m.id AS manufacturer_id,
'P0001' AS code,
ss.id AS subsystem_id
FROM system s
JOIN manufacturer m
ON m.name = 'nameXY'
JOIN subsystem ss
ON ss.code = 'NAME PATTERN'
WHERE s.initial = 'P'
我希望这有效。
答案 1 :(得分:0)
8000个插入/ mn大约是每秒133个或每个语句0.133毫秒。
如果INSERT发生在循环其自己的事务中的每个语句中,这是可以预期的。
每个事务都提交到磁盘并等待磁盘确认数据是否写入持久存储。众所周知这很慢。
使用BEGIN和END在循环周围添加一个事务,它将以正常速度运行。
理想情况下,如果可能的话,你甚至不会有一个循环,而是一个更复杂的查询,它会执行单个INSERT来从其源创建所有行。