插入subselect慢

时间:2015-02-25 13:00:29

标签: postgresql

我尝试填写表“SAMPLE”,需要来自其他三个表的ID。 需要填写的表“SAMPLE”看起来如下:

  • id(整数,非空,pk)
  • 代码(文字,非空)
  • subsystem_id(integer,fk)
  • system_id(整数,非空,fk)
  • manufacturer_id(整数,fk)

当前查询如下所示:

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配置是否严重搞乱。

为了澄清,更多表格信息: 的子系统:

  • 此表保存固定值(9),其中包含我可以轻松访问的基本模式。

系统

  • 此表包含可使用“初始”属性
  • 标识的固定值(4)

制造商

  • 此表包含制造商的名称。

“SAMPLE”表将是这些表之间的唯一连接,因此我不确定是否可以使用连接。

我很确定8k值应该是插入数据库的一个巨大的笑话所以我真的很困惑。

我的规格: 赢7 x86_64 8GB RAM intel i5 3470S(QUAD)2,9 GHZ Postgres是v9.3

我在查询过程中没有看到任何高峰,所以我怀疑我的配置有问题。如果您需要有关它的信息,请告诉我。

注意:我可能在子系统或制造商表中找不到代码或名称。我没有添加任何内容,而是想在单元格中添加NULL值。

2 个答案:

答案 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来从其源创建所有行。