我们目前正在构建基于Web的一些工业流程可视化,这些流程可生成大量数字和模拟值,这些值都写入数据库中的归档表。每个条目都包含以下字段:
PlantId
(整数,唯一标识一台机器)DatapointId
(整数,指定来自机器的特定值)ValueDate
(日期时间)Value
(双倍)用于选择和查看这些值的页面包含每当所选时间范围发生变化时请求其数据的同步Dygraphs图表的变化数量(取决于机器,通常约为12到20)。最初,过去7天加载。我使用了一个Ajax get请求,它从我的控制器返回一个本机数组作为Json,结果证明它比CSV方式更有效。
当我只请求一系列数据时,请求大约需要500毫秒才能完成,这在我看来是相当不错的,因为存档数据需要由PlantId,DatapointId,一个表的开始和结束日期时间选择。几亿行。
当我激活更多图表并因此请求时,问题就出现了。 3或4个请求仍然可以合理地快速运行,但是每增加一个请求,事情就会呈指数级变差。当我请求所有需要显示的图表数据时(让我们说15),需要很长时间才能完成,有时请求会在空间中丢失"。
这是我的控制器代码,负责检索请求的数据:
var result = db.ValueArchive.Where(x => x.DatapointId == DatapointId && x.PlantId == PlantId && x.ValueDate >= StartDate && x.ValueDate < EndDate).AsEnumerable().Select(s => new double[] { JsTimeStamp((DateTime)s.DateValue), (Double)s.Value }).ToArray();
(JsTimeStamp()是我将日期时间转换为unix时间戳(这是dygraphs的原生格式)的一个小函数。)
我不知何故感觉到控制器方法被调用太频繁了。当在相对较短的时间间隔内发送太多数据库查询时,事情变得糟糕。一个请求需要半秒钟才能完成,15个几乎同时发出的请求需要大约一分钟。
我可以做些什么来改善这种状况?