node-postgres 参数化查询运行速度慢 10 倍

node-postgres parameterized query runs 10 times slower

提问人:Robert 提问时间:7/4/2023 最后编辑:marc_sRobert 更新时间:8/10/2023 访问量:46

问:

我正在使用 node-posgres 参数化查询

但是,它插入数据的速度非常慢:100 行需要 5 秒!

切换到 pg 格式并生成普通的旧 SQL 字符串(即使一次执行一个字符串)将插入 100 行相同数据的时间缩短到 125 毫秒

(如果我将所有 100 个插入 SQL 字符串连接起来并将其作为单个查询发送,则只需 25 毫秒)

我发现这个问题(请注意,从 2010 年 12 月 13 日开始)表明 C# PostgreSQL 客户端存在严重问题。

是一样的吗?node-postgres

也就是说,我们不应该使用 参数化查询,还是我只是在做一些愚蠢的事情?node-postgres

  • 第 8.11.1 页
  • 节点 v18.14

谢谢!

如果您有兴趣,以下是基本的慢代码:

const insertSQL = `
    INSERT INTO "mytable"
    (  "column1", "column2", "column3",
        "column4", "column5", "column6",
        "column7", "column8", "column9"
    ) VALUES ( $1, $2, $3, $4, $5, $6, $7, $8, $9 );
`;

await pgClient.query("BEGIN");
for( let i=0; i<100; i+=1 ) {
    const test_data = test_datum[i];
    const values = [
            test_data.column1, test_data.column2, test_data.column3,
            test_data.column4, test_data.column5, test_data.column6,
            test_data.column7, test_data.column8, test_data.column9
        ];
    await pgClient.query(insertSQL, values);
}
await pgClient.query("COMMIT");

以及插入 100 条记录的 pg 格式代码 在 125毫秒内:

await pgClient.query("BEGIN");
for( let i=0; i<100; i+=1 ) {
    const test_data = test_datum[i];
    const insertSql = pgformat(`
            INSERT INTO "mytable"
            (  "column1", "column2", "column3",
                "column4", "column5", "column6",
                "column7", "column8", "column9"
            ) VALUES (%L,  %L,  %L, %L,  %L,  %L, %L,  %L,  %L );
        `, test_data.column1, test_data.column2, test_data.column3,
            test_data.column4, test_data.column5, test_data.column6,
            test_data.column7, test_data.column8, test_data.column9 );
    await pgClient.query(insertSQL);
}
await pgClient.query("COMMIT");

node.js postgresql node-postgres

评论

0赞 Bohemian 7/4/2023
由于 SQL 中的语法错误,您所谓的 125 毫秒代码根本无法运行 - 最后一个后面有一个错误的逗号。发布代码时请准确无误。%L
0赞 Bohemian 7/4/2023
变量的数据类型和对应列的数据类型有哪些?顺便说一句,我会从您的 SQL 中删除所有引号,因为它们是不必要的代码噪音。test_data.columnX
0赞 Robert 7/4/2023
这只是示例 SQL,为您提供一个想法。不幸的是,我无法发布真正的代码。
0赞 Robert 7/4/2023
一些实际列名需要引号,但同意,我可以进一步简化示例代码。(实际)列大多是字符串、几个数字和几个日期。我有大约 10 个不同表的类似代码,每个表使用参数化查询都比使用 pg-format 格式化的 SQL 字符串慢得多。
0赞 Bohemian 7/4/2023
我试图揭示的要点是参数类型应与列类型一致,以避免类型转换开销。尽管您所经历的性能影响似乎超出了转换会导致的范围,但值得消除这一方面。

答: 暂无答案