1

私は、1億6000万までの行をたくさん含むPostgreSQLデータベースを持っています。データベースは基本的にネットワークログのセットです。タイムスタンプであるtimeという列があります。基本的に、一意の時間ごとに、ネットワーク上の各マシンのログがあります。したがって、同じタイムスタンプを持つ複数の行があります。すなわち

time    ip             value
2:00    192.168.1.1    5
2:00    192.168.1.2    4
2:00    192.168.1.3    5
3:00    192.168.1.1    3
3:00    192.168.1.2    5
3:00    192.168.1.3    2
etc     etc

これは、私が常に関連してクエリを実行するフィールドであるため、時間ごとにこのデータベースのインデックスを作成しました。

i.e. select * from networklogs where time = '2:00' and value = 5

インデックスを使用しない場合、クエリはデータベース全体をスキャンする必要があるため、すべてのクエリに約2分かかります。クエリが一致する時間を含むデータのサブセットを見つけて、ここから別の値に基づいてフィルタリングするようにインデックスを作成したので、クエリがはるかに高速になることを望みました。

ただし、クエリには時間がかかるようです...

pgAdminでは、クエリが時間インデックスを使用し、時間インデックスがデータを合計160,000,000から約800,000アイテムに絞り込み、クエリのフィルターがこのデータを1,700アイテムに絞り込むと説明しているため、これは奇妙です。この説明には17ミリ秒かかりますが、クエリを実行すると3分かかります。

これは、160,000,000アイテムで2つの一致基準を検索するよりも高速です。

なぜ速くないのか理解できません。pgAdminがクエリをタイムインデックスを使用していると説明していても、クエリが実行されるときに実際にそれを使用するのでしょうか。

誰かアイデアや提案はありますか?

ありがとう、ジェームズ

更新:次のコマンドでEXPLAINANALYZEを実行しました。

explain analyze select latitude,longitude from networklogs where value = 5 and time = '2:00'

結果は次のとおりです。

"Bitmap Heap Scan on networklogs  (cost=13178.17..1488620.94 rows=848 width=19) (actual time=3507.923..278760.509 rows=33 loops=1)"
"  Recheck Cond: (time = '2:00'::timestamp without time zone)"
"  Rows Removed by Index Recheck: 38302021"
"  Filter: (value = 5)"
"  Rows Removed by Filter: 882873"
"  ->  Bitmap Index Scan on timeindex  (cost=0.00..13177.95 rows=530111 width=0) (actual time=695.771..695.771 rows=882906 loops=1)"
"        Index Cond: (time = '2:00'::timestamp without time zone)"
"Total runtime: 278764.148 ms"
4

2 に答える 2

3

これらが主に検索対象のパラメーターである場合は、複数のインデックスを作成することをお勧めします。実際の状況では、データベースには時間通りにインデックスがあるため、どの行がこの条件に一致するかを知ることができますが、インデックスによって指定されたすべての異なる場所からそれらをフェッチしてから、二次条件をチェックする必要があります。

CREATE INDEX time_and_value ON networklogs (time, value);

このインデックスを使用すると、データベースは別の条件をチェックするためにデータをフェッチする必要がなくなり、検索条件に既に一致していることがわかっているデータをフェッチするだけになります。もちろん順序は重要です。

緯度と経度のデータを使用しているようですが、タイプを使用すると、Postgres にデフォルトで付属pointするすべての幾何学的演算子を使用できるようになる可能性があります。この種のデータも索引付けできます。

于 2012-12-03T16:41:19.627 に答える
2

PostgreSQL には、クエリの実行方法を調べるためのEXPLAIN と EXPLAIN ANALYZEがあります。PG 管理者が EXPLAIN を使用してクエリの実行方法を通知する可能性があります。EXPLAIN ANALYZE を使用すると、より正確な結果が得られる場合があります。これは実際にクエリを実行し、実際の実行から統計を生成します。期待どおりにインデックスを使用している場合でも、少なくともどこで時間が費やされたかを確認できます。

于 2012-12-03T15:54:45.787 に答える