簡體   English   中英

如何從node.js快速將許多腳本生成的記錄放入PostgreSQL中?

[英]How can I put many script-generated records in PostgreSQL quickly from node.js?

以下代碼從node.js向PostgreSQL服務器中插入了200,000條記錄,在我的筆記本電腦上花費了大約17分鍾的時間,這真是太慢了。

var pg = require('pg');
var Client = pg.Client;
var async = require('async');

var client = new Client(connectionString);
client.connect();

var rollback = function(client) {
  client.query('ROLLBACK', function() {
    client.end();
    process.kill();
  });
};

client.query('BEGIN',function(err,result){
  if(err){ console.error(err); rollback(client);};
  async.waterfall([
    function(cb){
      client.query('DROP INDEX idx',function(err,result){
        client.query('TRUNCATE TABLE tbl',function(err,result){
          async.forEach(values,function(value,valueNext){
            client.query('INSERT INTO tbl ('
                         + 'col1,'
                         + 'col2) VALUES ($1,$2)',[
                           value,
                           generatedSomething(value)
                         ],function(err){
                           valueNext();
                         });
          },function(err,result){
            if(err){ console.error(err); rollback(client);cb(false);return;};
            client.query('CREATE INDEX idx ON tbl',function(err,result){
              cb(null);
            });
          });
        });
      });
    });
  },
],function(err){
  client.query('COMMIT', client.end.bind(client));
});

我采用了一些策略來加快速度。

  • 插入之前刪除所有索引,在所有插入完成后創建它 ……好
  • 使用TRUNCATE TABLE而不是DELETE FROM ... ok
  • 使用COPY FROM而不是INSERT INTO ...未完成

似乎使用COPY FROM而不是INSERT INTO會生效,但是它用於導入的CSV文件,而不是用於腳本生成的值。

那么,這是否意味着將腳本生成的值導出到臨時CSV文件,並使用COPY FROM導入值是將值快速插入PostgreSQL的最有效方法?

copyFrom將返回一個WritableStream ,您可以將其值附加為CSV,例如:

var stream = client.copyFrom("COPY tbl (col1, col2) FROM STDIN WITH CSV");
stream.on('close', function() {
  client.query("COMMIT");
});
stream.on('error', rollback);
async.forEach(values, function(value, valueNext) {
  stream.write(value + "," + generatedSomething(value) + "\n");
});
stream.end();

當然,您將需要適當地逃避自己的價值觀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM