带有mssql和节点的流查询,第一次非常慢

问题描述 投票:0回答:2

我正在使用节点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示例从查询中流式传输数据,...

sql node.js stream tedious node-mssql
2个回答
0
投票

当查询第一次运行缓慢但在随后的执行中快速运行时(如某人先前所建议的那样,通常是由于缓存。性能很可能与数据库所运行的存储设备有关。

我希望解释计划在两次执行之间不会改变。


0
投票

您应该删除对where子句的转换,或创建一个计算索引(如果可能的话,在数据库中)

© www.soinside.com 2019 - 2024. All rights reserved.