我正在尝试编写一个小型代理,该代理在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行,但其他查询则不行。