1

かなり長い間私を悩ませてきた特定の設計上の質問があります。何千ものアセットのポイント エントリを含む大規模なリアルタイム 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 に移行しています

4

2 に答える 2

1

そのIN(...)を排除すると役立つ場合があります。

次のようなものを試してください

--
--  index on AssetID, EventTime desc
--
select
      AssetID
    , LocationID
    , EventTime
from LocationLog as a
join (
        select AssetID_1
        union
        select AssetID_2
        union
        select AssetID_3
        -- etc, list of assets needed in report
      ) as b on b.AssetID = a.AssetID
where a.EventTime = (select max(xx.EventTime) 
                       from LocationLog as xx 
                      where xx.AssetID = a.AssetID
                        and xx.EventTime <= '2012-08-28 12:05:00')
;
于 2012-08-28T17:06:41.600 に答える
0

次の 2 つのことが思い浮かびます。

  • 各アセットの 1 日の終わりの場所を毎日格納して、場所に関するマテリアライズド ビューを維持します。また
  • 仕切り、仕切り、仕切り!たとえば、各パーティションに 1 週​​間分のデータしかない場合、そのような検索ははるかに安価になります。

私はおそらくテーブルを作成し、毎日の終わりにテーブルをend_of_day_locationクリアする代わりに、その内容を最初に入れます。last_known_locationINSERTend_of_day_location

于 2012-08-28T13:50:10.450 に答える