]> granicus.if.org Git - postgresql/commit
Fix cost estimation for indexscans on expensive indexed expressions.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 4 Mar 2015 04:23:17 +0000 (23:23 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 4 Mar 2015 04:23:24 +0000 (23:23 -0500)
commitb9896198cfbc1b0cd0c631d2af72ffe34bd4c7e5
tree0b7753d1cf02851df88980450e872756ae7ae102
parentf8b031bca848a21fb9a7c9530f8cdc7eb6919dd9
Fix cost estimation for indexscans on expensive indexed expressions.

genericcostestimate() and friends used the cost of the entire indexqual
expressions as the charge for initial evaluation of indexscan arguments.
But of course the index column is not evaluated, only the other side
of the qual expression, so this was a bad overestimate if the index
column was an expensive expression.

To fix, refactor the logic in this area so that there's a single routine
charged with deconstructing index quals and figuring out what is the index
column and what is the comparison expression.  This is more or less free in
the case of btree indexes, since btcostestimate() was doing equivalent
deconstruction already.  It probably adds a bit of new overhead in the cases
of other index types, but not a lot.  (In the case of GIN I think I saved
something by getting rid of code that wasn't aware that the index column
associations were already available "for free".)

Per recent gripe from Jeff Janes.

Arguably this is a bug fix, but I'm hesitant to back-patch because of the
possibility of destabilizing plan choices that people may be happy with.
src/backend/utils/adt/selfuncs.c