2016-08-03 14 views
1

gps追跡アプリケーションを持っています。着信GPSデータが頻繁に格納されるgps_vehicle_dataという名前のテーブルがあります。私は頻繁な間隔でこのテーブルを照会して、生のデータだけを含んでいるので、それを処理します。最近、私はテーブル上の選択ステートメントの実行に長い遅延があることを目撃しています。以下はEXPLAINの結果です。私はまた、VACUUM &を次の結果を貼り付けることを試みました。理由は何でしょうか?Postgresテーブル選択クエリが遅すぎる

EXPLAIN (ANALYZE, BUFFERS) select * from gps_vehicle_data; 

                  QUERY PLAN                
--------------------------------------------------------------------------------------------------------------------------------- 
Seq Scan on gps_vehicle_data (cost=0.00..130818.81 rows=1400881 width=1483) (actual time=209.129..62488.822 rows=9635 loops=1) 
    Buffers: shared hit=13132 read=103678 dirtied=67 written=25 
Planning time: 0.050 ms 
Execution time: 62500.850 ms 

VACUUM OUTPUT。

VACUUM (VERBOSE,ANALYSE) gps_vehicle_data; 
INFO: vacuuming "public.gps_vehicle_data" 
INFO: index "gps_vehicle_data_pkey" now contains 1398939 row versions in 10509 pages 
DETAIL: 0 index row versions were removed. 
0 index pages have been deleted, 0 are currently reusable. 
CPU 0.07s/0.09u sec elapsed 9.38 sec. 
INFO: index "gps_vehicle_data_status_idx" now contains 1398939 row versions in 4311 pages 
DETAIL: 0 index row versions were removed. 
0 index pages have been deleted, 0 are currently reusable. 
CPU 0.03s/0.04u sec elapsed 4.50 sec. 
INFO: index "gps_vehicle_data_url_data_idx" now contains 1399004 row versions in 98928 pages 
DETAIL: 0 index row versions were removed. 
0 index pages have been deleted, 0 are currently reusable. 
CPU 0.76s/0.88u sec elapsed 82.74 sec. 
INFO: index "gps_vehicle_data_createdon_idx" now contains 1399007 row versions in 3946 pages 
DETAIL: 0 index row versions were removed. 
0 index pages have been deleted, 0 are currently reusable. 
CPU 0.00s/0.02u sec elapsed 1.92 sec. 
INFO: "gps_vehicle_data": found 0 removable, 1402484 nonremovable row versions in 116884 out of 116884 pages 
DETAIL: 1401490 dead row versions cannot be removed yet. 
There were 143431 unused item pointers. 
Skipped 0 pages due to buffer pins. 
0 pages are entirely empty. 
CPU 1.70s/2.38u sec elapsed 200.61 sec. 
INFO: vacuuming "pg_toast.pg_toast_17296" 
INFO: index "pg_toast_17296_index" now contains 0 row versions in 1 pages 
DETAIL: 0 index row versions were removed. 
0 index pages have been deleted, 0 are currently reusable. 
CPU 0.00s/0.00u sec elapsed 0.01 sec. 
INFO: "pg_toast_17296": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages 
DETAIL: 0 dead row versions cannot be removed yet. 
There were 0 unused item pointers. 
Skipped 0 pages due to buffer pins. 
0 pages are entirely empty. 
CPU 0.00s/0.00u sec elapsed 0.01 sec. 
INFO: analyzing "public.gps_vehicle_data" 
INFO: "gps_vehicle_data": scanned 30000 of 116884 pages, containing 335 live rows and 359656 dead rows; 335 rows in sample, 1042851 estimated total rows 
VACUUM 
+3

あなたのテーブルには、**ロット**のクリーンアップできないデッド・ローが含まれています(「1401490デッド・ロー・バージョンはまだ削除できません」)。その可能性が最も高いのは、古い行のクリーンアップを防ぐ 'アイドル状態のトランザクション '接続があることです。 –

答えて

1

あなたは、いくつかの10000行を取得するには100000個のブロックの上に読んで、それはあなたのテーブルには、(それがテーブルの膨張に苦しんでいる)何でほぼ完全に構成されていることを意味します。

テーブルにはさらに多くのデータが含まれている必要があります。そのほとんどは削除されており、これが原因で膨らんでいました。

@a_horse_with_no_nameに記載されているように、いくつかの古いトランザクションがブロックされているため、一部の行を再利用できませんが、VACUUMは不本意な行を解放しますが、テーブルを再構成して、

この場合の正しい解決方法は、VACUUM (FULL, ANALYZE) gps_vehicle_dataです(表の統計情報がオフになっているので、ANALYZEは有効です)ので、表が再構成されます。ただし、VACUUM (FULL)が実行されている間は、テーブルへのすべてのアクセスがブロックされることに注意してください。

+0

ありがとう。私はデータベースに接続されているすべてのアプリケーションサーバーをシャットダウンし、VACUUM(VERBOZE、ANALYZE)を実行し、空き行を削除しました。今やクエリはずっと高速です。また、メンテナンス時にはVACUUM(FULL、ANALYZE)を試してみます。 –

+1

定期的に 'VACUUM(FULL)'を実行しないでください。通常、大量の削除を行わない限り、テーブルは膨大にならないはずです。 –

+0

はい、生データが処理されると大量削除が行われます。その場合大丈夫ですか、それとも問題がありますか? –

関連する問題