1

さまざまなデバイスの現在のGPS位置を取得するために、ウェブスクレーパーの小さなコレクションを使用しています。歴史的な記録も残したいです。データを2回保存せずにこれを行うための最良の方法は何ですか?今のところ、2つのテーブルがあり、どちらも次のようになっています。

 Column  |            Type             |   Modifiers   | Storage  | Description
---------+-----------------------------+---------------+----------+-------------
 vehicle | character varying(20)       |               | extended |
 course  | real                        |               | plain    |
 speed   | real                        |               | plain    |
 fix     | smallint                    |               | plain    |
 lat     | real                        |               | plain    |
 lon     | real                        |               | plain    |
 time    | timestamp without time zone | default now() | plain    |

1つは、という名前gpsで、もう1つは。という名前gps_logです。これら2つを更新する関数は、2つのことを実行します。最初にonを実行INSERTgps_log、その後、UPDATE OR INSERT(ユーザー定義関数)をonで実行しgpsます。SELECTただし、これにより、現在のデータに簡単にアクセスできる以外の目的で二重に保存するという無意味なケースのように思えます。

gps_log関数を使用して、それぞれの最新のエントリのみを選択させる簡単な方法はありvehicleますか?現在、 1397150gps_log行が増加し、15分ごとに約150行になるため、パフォーマンスが問題になる可能性があることに注意してください。

PerlDBIを介したPostgreSQL8.4の使用。

4

1 に答える 1

1

パフォーマンスが最優先事項である場合SELECT、冗長ストレージを備えた現在のソリューションはそれほど悪い考えではないかもしれません。

冗長なテーブルを取り除くと、次のような複数列のインデックスSELECTを使用してパフォーマンスを向上させることができます。

CREATE INDEX gps_log_vehicle_time ON gps_log (vehicle, time DESC);

vehicleそれが主キーであると仮定します。
この対応するクエリはかなり高速になります:

SELECT *
FROM   gps_log
WHERE  vehicle = 'foo'
ORDER  BY time DESC
LIMIT  1;

SELECT複数またはすべての行の最後のエントリに、この関連する手法を使用します

ただし、車両ごとに多くの行がある場合、インデックスは冗長テーブル(+インデックス)よりも大きくなるため、合計ストレージサイズはおそらく大きくなります。

の代わりに代理主キーとしてシリアル列を追加すると、ストレージとパフォーマンスに役立つ場合がありますvehicle。特に、それを指す外部キーがある場合。

time余談ですが、列名として使用しないでください。これはPostgreSQLのタイプ名であり、すべてのSQL標準では予約語です。timestamp列に名前を付けることも誤解を招きますtime

于 2012-11-28T09:07:54.743 に答える