1

「大きな」(数十万行)テーブルがあります(dataPointsと呼びます)。データポイントと 1 対多の関係を持つ「イベント」の別のテーブル。events テーブルには、タイプの TimeStamp 列がありDateTimeOffsetます。特定の時間範囲内のすべてのデータポイントをクエリしたいのですが、重要な注意点が 1 つあります。入力カットオフ時間まで補間する必要があります。

例: 過去にランダムに分散した時刻 (-1 時間、-5 時間、-8 時間、-11 時間、-13 時間) にイベントがあるとします。これらのイベントのそれぞれがいくつかの dataPoints を作成し、過去 12 時間のすべてのデータポイントを照会したいと考えています。これらすべてのポイント (-13 時間のポイントを含む) に関連付けられたデータポイントを取得する必要があります。この理由は、カットオフ時間 (-12 時間) のデータが必要なためです。したがって、-11 時間のポイントと -13 時間のポイントの両方が必要なので、-12 時間に補間できます。where dataPoint.Event.Time > currentTime - 12単純に、それ以上のポイントを獲得する必要があるとは言えません。

これを LINQ to SQL で表現する方法はありますか? 私は2つのアイデアしか思いつきませんでした:

1) ヒューリスティック (カットオフを 2 倍にする) を使用して、十分なポイントがあることを確認します。これは堅牢ではなく、無駄になる可能性があります。

2) 最初にすべてのイベントをクエリし、それらを並べ替え、手動でロールオーバーするだけで最後に必要なイベントを特定し、計算されたイベントよりも少ないタイムスタンプですべてのデータポイントをクエリします。これには多くのコードが必要であり、無駄でもあります。

他のアイデアはありますか?

4

1 に答える 1

1

私はこのようにします:

  1. 締切日時を含むまでのすべてのイベントを照会する
  2. 手順1でプルされた最後のイベントよりも前に最初のイベントをクエリします

日時列にインデックスがある場合、両方がすばやく実行されます。唯一の問題は、追加の往復です。

これはアイデア2に似ていますが、ステップ2でクエリを実行する必要があるのは最大で1つのイベントだけです。これには多くのコードは必要ないと思います。

クエリ2は次のようになります。

(from e in db.Events
where e.DateTime < lastDateTime
order by e.DateTime
select e).Take(1)

これにより、インデックスシークが1行を返します。非常に効率的です。

于 2012-08-13T17:10:46.540 に答える