节点JS-SQL Server流到文件奇怪的行为

时间:2018-06-22 06:43:41

标签: sql-server node.js file stream

我正在尝试编写一个小型代理,该代理在SQL Server模块“ mssql”上运行查询。

我尝试将每一行作为JSON格式附加到文件中并压缩该文件。

var sql = require('mssql');
const fs = require("fs");
const zlib = require('zlib');
var ini = require('ini');
var config = ini.parse(fs.readFileSync('./config.ini', 'utf-8'));
var out = fs.createWriteStream('result.txt.gz', {flags: 'a'});
var JSONStream = require( "JSONStream" );
const gzip =  zlib.createGzip();

var transformStream = JSONStream.stringify();

var sqlConfig = {
  user: config.database.user,
  password: config.database.password,
  server: config.database.server,  
  database: config.database.database
};

(async function(){
    console.log("sql connecting......");
    sql.connect(sqlConfig, function(err) {
        if (err) throw err;

        const request = new sql.Request()
        request.stream = true 
        request.query(config.database.query) 
        transformStream.pipe(gzip).pipe( out );

        request.on('row', row => {
            transformStream.write(row); 
        })

        request.on('error', err => {
            if (err) throw err;
        })

        request.on('done', result => {
            transformStream.end();
            sql.close();
        })
})

sql.on('error', err => {
    if (err) throw err;
})

})()

查询存储在.ini文件中。

取决于我通过的查询的行为很奇怪:我的前1000名查询在SSMS中花费0秒,在使用此代码时花费0秒=>这是正常的。

当我使用相同的查询但仅在日期> =昨天的行中进行过滤而没有前1000条时,该查询返回700行并且需要50分钟才能运行。

最后,生成的文件经过55mb压缩,未压缩的文件超过1GB。 如果我在SSMS中运行查询,则只需不到10秒的时间

就大小而言,我不应该拥有700行的1gb文件,因此存在无法解决的问题。

以下是提到的SQL查询:

查询A:

SELECT TOP 1000 list_of_columns 
FROM TABLE 
WHERE field_A = 'X' AND field_B = 'Y'"

查询B:

SELECT list_of_columns
FROM TABLE 
WHERE field_A = 'X' 
  AND field_B = 'Y' 
  AND field_date >= DATEADD(dd, DATEDIFF(dd, 0, GETDATE() - 1), 0)

首先,我认为问题可能出在以下事实:我试图将流重定向到文件而不是POST请求,这可能太慢了,但是查询A是如何用我的在不到一秒钟的时间内可以读取1000行,但其他查询则不行。

0 个答案:

没有答案