首页 > 解决方案 > 在 postgresql 9.6 中优化批量 xml 数据插入

问题描述

我目前正在优化一个 xml 解析器,我目前在将 10,000 条记录批量插入到 postgres 中的 xml 数组中时遇到瓶颈。这个版本的 postgres 没有实现 xmltable。以下代码是我目前拥有的:

create unlogged table xmltable(
 xml_element1 xml[],
 xml_element2 xml[],
 xml_element3 xml[]
);

v_xml := XMLPARSE(DOCUMENT convert_from(src_blob, 'UTF8') );

INSERT INTO xmltable ( xml_element1, xml_element2, xml_element3)
     SELECT 
         (xpath ('element1parent/element1feature', x_xml)),
         (xpath ('element2parent/element2feature', x_xml)),
         (xpath ('element3parent/element3feature', x_xml)),
     FROM (SELECT unnest(xpath('/Root/grandparent',v_xml)) as x_xml);

drop table xmltable;


Current processing time is about 4 minutes for xml_element1 = 40 inserts, 
xml_element2 = 9,980 inserts, xml_element3 = 0 inserts.

我尝试过的几件事是:

在临时表和未记录表之间切换 使用 v_xml := convert_from(src_blob, 'UTF8')::xml 分解查询

任何见解将不胜感激!

标签: xmlpostgresqlxpathquery-optimization

解决方案


我想通了,unnest 函数是不必要的,并且会累积很多开销。

这要快得多:

INSERT INTO xmltable ( xml_element1, xml_element2, xml_element3)
 SELECT 
     (xpath ('/Root/grandparent/element1parent/element1feature', v_xml)),
     (xpath ('/Root/grandparent/element2parent/element2feature', v_xml)),
     (xpath ('/Root/grandparent/element3parent/element3feature', v_xml));

推荐阅读