0

これは、マシンのメーター測定値を格納するテーブルの構造です。任意の日付の測定値を取得し、新しい測定値を検証できるように、すべての測定値を保存する必要があります。

ここに画像の説明を入力

私はAssetID、ForDate Descendingにインデックスを持っているので、最新の測定値が一番上にあります。

このテーブルを備えたマシンの最新の検針値を見つけるのに時間がかかりすぎています。2 人以上の人が一度に読み取り値を入力しようとすると、同時実行の問題が発生するため、マシンに対してメーター読み取り値を非正規化したくありません。

これをより速くするための提案はありますか?

編集: これは私の 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

多くまたはすべての AssetID の 1 つの行または最新のエントリを取得しようとしていますか? 多くの異なるアセットの最新のエントリを多数クエリしようとしている場合、インデックスはあまり役に立ちません。

することをお勧めします

  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 indexの上IsLatestReading DESC, AssetID, ForDate

注: 読み取り値を読み込むために一括挿入を使用する場合、トリガーは必要ありません。列を更新するだけで済みます...

于 2013-09-16T06:58:31.760 に答える