私は、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"