Postgresql索引未在内连接中使用

时间:2016-02-23 17:12:03

标签: postgresql inner-join postgresql-performance

我正在使用9.1

以下是查询:

select a.id,b.flag              
from a, b               
where b.starting_date>='2002-01-01'::date               
and a.zip_code= b.zip_code              
and abs( a.date1-b.date1 ) <=60                 
and abs( a.balance-b.balance ) <=1000               
and abs( a.value-b.value ) <=3000   

表a和b使用btree将每个字段索引(不是多列索引)。

以下是explain analyze verbose结果:

Merge Join  (cost=0.00..448431434.24 rows=440104742 width=16) (actual time=384.268..15151912.652 rows=672144 loops=1)   
  Output: a.id, b.flag  
  Merge Cond: (a.zip_code = b.zip_code) 
  Join Filter: ((abs((a.date1 - b.date1)) <= 60) AND (abs((a.balance - b.balance)) <= 1000) AND (abs((a.value - b.value)) <= 3000)) 
  ->  Index Scan using indx_a_zip_code on a  (cost=0.00..950851.26 rows=6800857 width=32) (actual time=0.028..22292.274 rows=2080440 loops=1)   
        Output: a.id, a.zip_code, a.date1, a.balance, a.value   
  ->  Materialize  (cost=0.00..1906889.40 rows=19744024 width=28) (actual time=0.032..6148075.701 rows=6472114362 loops=1)  
        Output: b.balance, b.date1, b.zip_code, b.starting_date, b.value,   
        ->  Index Scan using indx_zip_code on  b  (cost=0.00..1857529.34 rows=19744024 width=28) (actual time=0.025..76893.104 rows=19078422 loops=1)   
              Output:b.balance, b.date1, b.zip_code, b.starting_date    
              Filter: (b.starting_date >= '2002-01-01'::date)   
Total runtime: 15155983.643 ms  

在我看来,查询规划器正在使用zip_code的索引而不是其他字段。表a中有800万行,表b中有2000万行,完成需要3个小时(RAM为64GB,所有关键的postgresql服务器配置都根据以下内容进行了调整:

https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server

任何建议/建议表示赞赏。万分感谢!

0 个答案:

没有答案