2017-07-21 10 views
1

私は900万行のテーブルを使って私のポストグルで遅いクエリをしています。Postgres 9.4.12遅いクエリ

問合せ:EXPLAIN (ANALYZE, BUFFERS) SELECT date_point, geo, alarms, status FROM tracking_master WHERE id_asset = 151 AND date_point >= '2017-07-21 19:20:05' AND date_point <= '2017-07-21 19:25:05' ORDER BY date_point asc LIMIT 1000

ここでクエリが(、BUFFERSをANALYZE)EXPLAIN:

Limit (cost=161175.31..161175.32 rows=1 width=579) (actual time=60734.109..60734.113 rows=5 loops=1) 
    Buffers: shared hit=23470 read=114350 
    -> Sort (cost=161175.31..161175.32 rows=1 width=579) (actual time=60734.107..60734.110 rows=5 loops=1) 
     Sort Key: date_point 
     Sort Method: quicksort Memory: 27kB 
     Buffers: shared hit=23470 read=114350 
     -> Index Scan using idx_tracking_master_id_asset on tracking_master (cost=0.43..161175.30 rows=1 width=579) (actual time=80.682..60734.081 rows=5 loops=1) 
       Index Cond: (id_asset = 151) 
       Filter: ((date_point >= '2017-07-21 19:20:05-03'::timestamp with time zone) AND (date_point <= '2017-07-21 19:25:05-03'::timestamp with time zone)) 
       Rows Removed by Filter: 202512 
       Buffers: shared hit=23470 read=114350 
Planning time: 0.204 ms 
Execution time: 60734.152 ms 
+2

あなたが最適化しようとしているクエリは何ですか?テーブルはどのように定義されていますか?インデックス?何が改善されるかを知るには、より多くの情報が必要です。 – joanolo

答えて

2

クエリがなければ、それは助けることは難しいです。あなたのwhere句には次のようなものがあります:

id_asset=151 
AND (date_point >= '2017-07-21 19:20:05-03') 
AND (date_point <= '2017-07-21 19:25:05-03') 

id_asset列にインデックスがあります。

(id_asset, date_point)に複数列のインデックスを作成してみてください。あなたはORDER BY節も使用しているのを見ています。日付列にソート順を指定すると役立ちます。

例:

CREATE INDEX multicol_index ON tracking_master (id_asset, date_point DESC); 

(ヒント:使用VACUUMがインデックスを作成した後にANALYZE)

+0

これは明らかに正解ですが、ちょうど2つの発言です:1)なぜ、DESCがインデックス上にあるのですか? 2)良い統計は常に必要ですが、式にインデックスを作成しない限り、 'ANALYZE'する必要はありません。 –

+0

1、なぜASCですか? :)ユースケースに応じて同様に良いことがあります。私たちが知らないこと。 2、ANALYZEはDBMSに(文書に従って)統計情報の更新を強制します。また、私は習慣から分析するVACUUMを持っています。それは傷つけません。 –

+1

「怪我をしない」は、システムの負荷によって異なります。答えをありがとう! –