如何从node.js快速将许多脚本生成的记录放入PostgreSQL中
How can I put many script-generated records in PostgreSQL quickly from node.js?
下面的代码从node.js向PostgreSQL服务器插入了200000条记录,在我的笔记本电脑上花了大约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
。。。好的 - 使用
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();
当然,您需要正确地转义您的值
相关文章:
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- AngularJs对所有页面中的所有记录进行排序
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- window.location替换并传递URL历史记录条目中的变量
- Javascript历史记录转换为php行
- JavaScript,PHP-用JavaScript将多个数据库记录发送到变量或表
- 猫鼬在特定记录中查找嵌套记录
- 浏览器何时记录历史记录
- 将一个表的id与另一个表中的user_id进行匹配,以获取mysql中的记录
- 更新成员数据模型中的记录列表
- 如何使用提交按钮搜索表中的记录
- 正在OrientDB中嵌入函数中的记录
- NodeJS和pg promise,捕获PostgreSQL异常
- 使用Rails 3中的AJAX删除记录
- 用javascript记录传递给回调的参数的约定是什么
- 在页面上记录数据并实现pushstate()的最佳方式
- 输入类型按钮返回历史记录并返回顶部
- 我怎么能把一个错误当作未捕获的错误来记录呢
- 在检索到最后一条记录后从 PostgreSQL 中提取记录
- 如何从node.js快速将许多脚本生成的记录放入PostgreSQL中