Sam*_*ami 5 sql-server bulkinsert node.js node-mssql
我正在使用node-mssql
我的查询文件如下
BEGIN TRANSACTION
DECLARE @status NVARCHAR(30);
SET @status = 'create';
DECLARE @i UNIQUEIDENTIFIER;
SET @i = NEWID();
DECLARE @t DATETIME2;
SET @t = SYSUTCDATETIME();
IF NOT EXISTS(
SELECT * FROM user WHERE email = @email AND company_id= @company_id
) BEGIN
SET @i = NEWID();
INSERT INTO user (comapny_id, id, email, password) VALUES ( @company_id, @i, @email, @password);
INSERT INTO user_transaction( id, date, type) VALUES ( @i, @t, @status);
SELECT @i as 'id', @email as 'email';
END ELSE BEGIN
SELECT NULL as 'id', @email as 'email';
END
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
我createuser在query.js文件中的查询是
datastore.getQueryFromSqlFile('create_user', (err: any, query: string) => {
if (err) {
done(err);
} else {
var request = new sql.Request(connectionOrTransaction);
request.input('email', sql.NVarChar(200), email);
request.input('password', sql.NVarChar(200), some_password);
request.input('company_id', sql.UniqueIdentifier, company_id);
request.query(query, function (err, data) {});
Run Code Online (Sandbox Code Playgroud)
现在,我需要修改这些内容以插入从CSV文件(> 20000个条目)导入的大量用户数据,我正在考虑执行以下操作
async.mapSeries(Object.keys(users), function (item, callback) {
query.createuser(email, company_id, function (err, data) {
callback(err, err ? 'Error message: ' + data : data);
});
}, function (err, results) {
})
Run Code Online (Sandbox Code Playgroud)
但这是无效的,因为我得到连接超时。增加connectionTimeout或requestTimeout进入配置文件并没有太大帮助。
如何在每次尝试中大约20000-40000个条目的批量插入中提高查询速度?
对我来说,这看起来像是一份准备好的声明的工作。
var ps = new sql.PreparedStatement();
ps.input('email', sql.VarChar);
ps.input('password', sql.VarChar);
ps.input('company_id', sql.Int);
ps.prepare(" ... your sql ... ", function(err) {
// ... error checks
// users must be an array of users
async.mapSeries(users, function(user, next) {
ps.execute({email: user.email, password: user.password, company_id: user.company_id}, next);
}, function(err) {
// ... error checks
ps.unprepare(function(err) {
// ... error checks
// done !
});
});
});
Run Code Online (Sandbox Code Playgroud)
每个都execute作为单个请求调用,因此您不应该因requestTimeout. connectionTimeout是只影响连接相位的东西。一旦连接到数据库,一切就requestTimeout变得重要了。