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、新しいインデックスを試みることができるあなたの
は、それがより速く4倍になった、ありがとうございます。もう1つ質問がありますか? cteのクエリでは、ビットマップインデックススキャンの前にビットマップヒープスキャンを使用し、それは彼らが何らかの方法でそれを避けることができる時間の95%を取る? –
あなたはもう一方がなくてはいけませんが、 'set enable_bitmapscan = 'off''でそのアルゴリズムを無効にして、それが通常のインデックススキャンを行い、それ以上の性能を発揮するかどうか確認できます。 –