我正在使用节点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(); });
我正在使用节点js 10.16.0和node-mssql模块连接到数据库。一切正常,我的简单查询也正常。如果我尝试使用node-mssql示例从查询中流式传输数据,...
当查询第一次运行缓慢但在随后的执行中快速运行时(如某人先前所建议的那样,通常是由于缓存。性能很可能与数据库所运行的存储设备有关。
我希望解释计划在两次执行之间不会改变。
您应该删除对where子句的转换,或创建一个计算索引(如果可能的话,在数据库中)