かなり長い間私を悩ませてきた特定の設計上の質問があります。何千ものアセットのポイント エントリを含む大規模なリアルタイム GPS ロケーション ログ テーブルがあります。ポイントは、アセットごとに 1 日あたり何百ものポイントがデータベースに入力されます。ターゲット アセットのポイント クエリを高速化するためのインデックス IX(asset asc,EventTime asc) があります。各アセットを最新のポイントに関連付けるために使用される LastKnownLocation テーブルがあります。これは、最新の既知のルックアップのみを提供します。私の質問は、一度に多くのアセットの特定のルックアップ日付が与えられた場合に、ロケーション ログ テーブルに最後に確認されたロケーションを照会できる効率的な方法を知っている人はいますか? 「Q: 2012 年 7 月 1 日の終わりに、すべての資産はどこにありましたか」
ところで、すべてのアセットは独自の内部単調イベントタイム スタンプでそのポイントを報告するため、各アセットに関連するテーブルの LocationLog.LocationLogID auto inc プライマリ キーとの暗黙の単調関係があります。これが、MAX Aggregate を使用できる理由です。
SELECT MAX(LocationLog.LocationLogID) FROM LocationLog
WHERE LocationLog.fk_AssetID IN
(
//LIST OF required assets for report
)
AND LocationLog.EventTime <= '2012/07/01 23:59:59'
GROUP BY LocationLog.fk_AssetID
問題は、データベース インデックス IX によって、個々のアセットのすべてのポイントにすばやくアクセスできることです。これらのポイントは、インデックス内の eventtime 順に整理されるため、dbengine はインデックス内の eventtime 内でデータ スキャンを実行して、日付が <= ルックアップ日である最大の LocationLogID を探します。ルックアップ日より前にアセットが報告されてからの時間が長いほど、一致を見つけるためのスキャンに時間がかかります。
私の位置情報ログは 9000 万行以上あり、このように 1000 個のアセット クエリを作成するには 50 秒かかります。
ルックアップ日付が指定された最後の既知の発生を見つけることは、よく知られている設計パターンである必要がありますが、私の検索ではうまくいきません。
PS: MSSQL2000 を実行していますが、Postgres に移行しています