0

这是我的表的结构,它存储机器的仪表读数。我需要保存所有读数,以便检索任何日期的读数并验证任何新读数。

在此处输入图像描述

我在 AssetID 上有一个索引,ForDate Descending 所以最新的读数在顶部。

使用此表查找机器的最新仪表读数需要很长时间。我不想针对机器对仪表读数进行非规范化,因为当两个或更多人尝试同时输入读数时会导致并发问题。

有什么建议可以加快速度吗?

编辑:这是我的 LINQ2SQL 查询

        Dim res = From a In db.AssetMeterReadings Where _
              a.AssetID = ast.AssetID And a.ForDate <= dAt.Date _
              And a.isInactive = False _
              Order By a.ForDate Descending, a.ApproximateReading Descending Take 1
4

2 回答 2

1

我认为您需要运行性能分析器来了解您的查询是否实际使用此索引。您没有提到它是什么 RDBMS,但在 SQL-Server 中,查询分析器中有一个“显示执行计划”选项。

有时,如果您对列有单独的索引,例如 Index1 ON AssetID,Index2 ON ForDate,则查询执行速度会更快。另外,我认为您不应该指定顺序。试试看单个索引是如何工作的

于 2013-09-16T04:09:48.667 回答
1

您是想只获取一行还是获取许多/所有 AssetID 的最新条目?如果您尝试查询许多不同资产的最新条目,那么索引对您的帮助不大。

我建议你

  1. 添加现在列IsLatestReading(bit)
  2. 添加trigger for INSERT, UPDATE, DELETE以保留列,请IsLatestReading 注意它会导致的递归触发器

    触发器类似于:

    update MyTable set IsLatestReading = 0 
    inner join DELETE on DELETE.AssetID = MyTable and IsLatestReading = 1
    
    update table  MyTable set IsLatestReady = 1
    inner join INSERTED on INSERTED.MeterReadingID = MyTable.MeterReadingID
    
  3. create indexIsLatestReading DESC, AssetID, ForDate

注意:如果您使用批量插入来加载读数,则不需要触发器,只需更新列即可...

于 2013-09-16T06:58:31.760 回答