我正在使用节点js 10.16.0和node-mssql模块连接到数据库。一切正常,我的简单查询也正常。
如果我尝试使用node-mssql example从查询中流式传输数据,则我第一次执行速度非常慢。它不会显示超时错误,但是大约需要一分钟或更长时间才能完成。
根据控制台日志,它带来前55行,然后停下来一会儿。根据下面的代码,当我划分它们时,似乎在数据“组”之间花费了一些时间。如果我第二次或第三次执行相同的查询,则只需一秒钟即可完成。行的总数约为25.000或更多
至少在第一次如何让我的流查询更快?
这是我的代码
在此示例之后,想法是开始流式传输,设置1000行,暂停流式传输,处理该行,使用websocket发送回,清空所有数组,继续进行流式传输,直到完成
let skate= [];
let leather= [];
let waterproof = [];
let stream_start = new Date();
const request = new sql.Request(pool);
request.stream = true;
request
.input('id_param',sql.Int,parseInt(id))
.input('start_date_param',sql.VarChar(50),startDate)
.input('stop_date_param',stopDate)
.query('SELECT skate,leather,waterproof FROM shoes WHERE id = @id_param AND CAST(startTime AS date) BETWEEN @start_date_param AND @stop_date_param ');
request.on('row',row => {
rowc++; console.log(rowc);
rowsToProcess.push(row);
if (rowsToProcess.length >= 1000) {
request.pause();
processRows();
}
});
const processRows = () => {
rowsToProcess.forEach((item,index) => {
skate.push(item.skate);
leather.push(item.leather );
waterproof.push(item.waterproof);
});
measurementsData.push(
{title: 'Skate shoes',data: skate},{title: 'Leather shoes',data: leather},{title: 'Waterproof shoes',data: waterproof}
);
console.log('another processRows done');
//ws.send(JSON.stringify({ message: measurementsData }));
rowsToProcess = [];
skate= [];
leather= [];
waterproof = [];
measurementsData = [];
request.resume();
}
request.on('done',() => {
console.log('rowc,',rowc);
console.log('stream start,stream_start);
console.log('stream done,new Date());
processRows();
});