2017-07-07 12 views
1

PostgreSQLの最適化で助けを求めています。PostgreSQLの統計情報でidx_scanの値が非常に低い

私は中規模のテーブル(約2,000,000レコード)を持っている、と私は次のように非常に単純なクエリを書いた:私は「LICENSE_KEY」、「user_idの」と「device_hash」に関する簡単なインデックスを持っている

SELECT COUNT (DISTINCT(user_id)) 
FROM fp left outer join sd ON fp.session_id = sd.session_id 
WHERE fp.license_key = 'license' AND sd.device_hash = 'hash' 

(3つのインデックス) エグゼキュータは、テーブルに700.000以上の一致があり、Seq Scanの方が適しているため、license_keyインデックスを使用したくありません。

Aggregate (cost=396247.61..396247.62 rows=1 width=17) 

    -> Hash Join (cost=99668.54..396152.13 rows=38195 width=17) 

     Hash Cond: ((fp.session_id)::text = (sd.session_id)::text) 

     -> Seq Scan on fp (cost=0.00..293450.55 rows=706957 width=45) 

       Filter: ((license_key)::text = 'license'::text) 

     -> Hash (cost=98678.10..98678.10 rows=79235 width=28) 

       -> Bitmap Heap Scan on sd (cost=2902.50..98678.10 rows=79235 width=28) 

        Recheck Cond: ((device_hash)::text = 'hash'::text) 

        -> Bitmap Index Scan on "sd.device_hash_btree_idx" (cost=0.00..2882.69 rows=79235 width=0) 

          Index Cond: ((device_hash)::text = 'hash'::text) 

私は私の統計情報をチェックする:

select * from where indexrelname= 'fp_license_key_btree_idx' 

relid | indexrelname | idx_scan | idx_tup_read | idx_fetch 
---------------------------------------------------------------------------- 
16430 |fp.license_key_btree_idx | 451 | 13641445  | 13641445 

あなたは私にアドバイスを与えることはできますか?どのように私はidx_scanを改善することができますか?あなたはCTE、新しいインデックスを試みることができるあなたの

答えて

0

ありがとう:

CREATE INDEX ON fp USING btree(session_id); --maybe cover license_key as well, but doubt it 

WITH s AS (SELECT session_id FROM sd WHERE sd.device_hash = 'hash'), 
    f AS (SELECT user_id, session_id 
      FROM fp 
      WHERE fp.license_key = 'license' 
       AND session_id = ANY((SELECT array_agg(session_id) FROM s)::int[])) 
SELECT COUNT (DISTINCT(user_id)) 
FROM f 
JOIN s ON f.session_id = s.session_id; --your left join is not left join anyway 
+0

は、それがより速く4倍になった、ありがとうございます。もう1つ質問がありますか? cteのクエリでは、ビットマップインデックススキャンの前にビットマップヒープスキャンを使用し、それは彼らが何らかの方法でそれを避けることができる時間の95%を取る? –

+0

あなたはもう一方がなくてはいけませんが、 'set enable_bitmapscan = 'off''でそのアルゴリズムを無効にして、それが通常のインデックススキャンを行い、それ以上の性能を発揮するかどうか確認できます。 –

関連する問題