【发布时间】:2019-11-25 12:44:49
【问题描述】:
我正在使用节点 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', sql.VarChar(50), 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();
});
【问题讨论】:
-
如果只是第一次,这听起来像是以后的查询正在使用缓存信息(计划、内存中的表等)。听起来该表的索引可能很差,或者
shoes是VIEW,背后有一些“复杂”的逻辑。 -
@Larnu 我的想法完全正确。那么,这是一个数据库问题吗?不,它不是视图。我应该先检查表索引吗?
-
取决于“数据库问题”的含义。如果表的索引很差,是数据库引擎故障吗?不;它是 DBA/开发人员。我会首先查看执行计划或推回上述人员。
-
第一件事是为鞋子的id字段添加一个非聚集索引。但只是名称指向不使用具有 100k+ 行的数据集,所以可能不是那样。
-
@smoore4 抱歉,我没听懂你对这些名字的看法。你能改写吗?谢谢
标签: sql node.js stream tedious node-mssql