xml - 在 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 分解查询
任何见解将不胜感激!
解决方案
我想通了,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));
推荐阅读
- javascript - (Javascript 问题)getElementById 无法获取元素,即使我可以在 Chrome 检查器中看到它
- mysql - 需要查询这个逻辑
- php - 在 php 中连接 mysql db 时出错
- python - 我正在尝试使用 python ctypes 打开一个用 c 编写的 dll 并在其中运行该函数,但它以字符的形式出现,而不是字符串
- python - 热图像处理
- blazor - 禁用在服务器端 Blazor 组件中获取数据时单击的元素
- rotational-matrices - 如何使用张量旋转规则旋转弹性刚度矩阵?
- scikit-learn - 创建生成器后从多标签二值化器获取标签
- python - 将 C++ OpenGL 移植到 PyOpenGL 无法正确渲染
- debugging - 环境变量未传递给 Visual Studio Code 中的调试器