PostgreSQL 9.1.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51), 64-bit
Dedicated DB server
- 4GB ram
- Shared_Buffers = 1 GB
- Effective_cache_size = 3GB
- Work_mem = 32MB
Analyze done
Queries ran multiple times, same differences/results
Default Statistics = 1000
Query (5366ms) :
explain analyze
select
initcap (fullname)
, initcap(issuer)
, upper(rsymbol)
, initcap(industry)
, activity
, to_char(shareschange,'FM9,999,999,999,999,999')
, sharespchange || + E'\%'
from changes
where activity in (4,5) and mfiled >= (select max(mfiled) from changes)
order by shareschange asc
limit 15
Slow Ascending explain Analyze:
http://explain.depesz.com/s/zFz
Query (15ms) :
explain analyze
select
initcap (fullname)
, initcap(issuer)
, upper(rsymbol)
, initcap(industry)
, activity
, to_char(shareschange,'FM9,999,999,999,999,999')
, sharespchange ||+ E'\%'
from changes
where activity in (4,5) and mfiled >= (select max(mfiled) from changes)
order by shareschange desc limit 15
Fast descending explain analyze:
http://explain.depesz.com/s/OP7
The index: changes_shareschange is a btree index created with default ascending order. The is index size is 32mb
The query plan and estimates are exactly the same, except desc has index scan backwards instead of index scan for changes_shareschange.
Yet, actual runtime performance is different by 357x slower for the ascending version instead of descending.
Why and how do I fix it?