mirror of
https://github.com/postgres/postgres.git
synced 2026-03-22 10:30:21 -04:00
genericcostestimate() estimates the number of index leaf pages to be visited as a pro-rata fraction of the total number of leaf pages. Or at least that was the intention. What it actually used in the calculation was the total number of index pages, so that non-leaf pages were also counted. In a decent-sized index the error is probably small, since we expect upper page fanout to be high. But in a small index that's not true; in the worst case with one data-bearing page plus a metapage, we had 100% relative error. This led to surprising planning choices such as not using a small partial index. To fix, ask genericcostestimate's caller to supply an estimate of the number of non-leaf pages, and subtract that. For the built-in index AMs, it seems sufficient to count the index metapage (if the AM uses one) as non-leaf. Per the above argument, counting upper index pages shouldn't change the estimate much, and in most cases we don't have any easy way of estimating the number of upper pages. This might be an area for further research in future. Any external genericcostestimate callers that do not set the new field GenericCosts.numNonLeafPages will see the same behavior as before, assuming they followed the advice to zero out that whole struct. Unsurprisingly, this change affects a number of plans seen in the core regression tests. I hacked up the existing tests to keep the tests' plans the same, since in each case it appeared that the test's intent was to test exactly that plan. Also add one new test case demonstrating that a better index choice is now made. Author: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: Henson Choi <assam258@gmail.com> Discussion: https://postgr.es/m/870521.1745860752@sss.pgh.pa.us |
||
|---|---|---|
| .. | ||
| amcheck | ||
| auth_delay | ||
| auto_explain | ||
| basebackup_to_shell | ||
| basic_archive | ||
| bloom | ||
| bool_plperl | ||
| btree_gin | ||
| btree_gist | ||
| citext | ||
| cube | ||
| dblink | ||
| dict_int | ||
| dict_xsyn | ||
| earthdistance | ||
| file_fdw | ||
| fuzzystrmatch | ||
| hstore | ||
| hstore_plperl | ||
| hstore_plpython | ||
| intagg | ||
| intarray | ||
| isn | ||
| jsonb_plperl | ||
| jsonb_plpython | ||
| lo | ||
| ltree | ||
| ltree_plpython | ||
| oid2name | ||
| pageinspect | ||
| passwordcheck | ||
| pg_buffercache | ||
| pg_freespacemap | ||
| pg_logicalinspect | ||
| pg_overexplain | ||
| pg_plan_advice | ||
| pg_prewarm | ||
| pg_stat_statements | ||
| pg_surgery | ||
| pg_trgm | ||
| pg_visibility | ||
| pg_walinspect | ||
| pgcrypto | ||
| pgrowlocks | ||
| pgstattuple | ||
| postgres_fdw | ||
| seg | ||
| sepgsql | ||
| spi | ||
| sslinfo | ||
| start-scripts | ||
| tablefunc | ||
| tcn | ||
| test_decoding | ||
| tsm_system_rows | ||
| tsm_system_time | ||
| unaccent | ||
| uuid-ossp | ||
| vacuumlo | ||
| xml2 | ||
| contrib-global.mk | ||
| Makefile | ||
| meson.build | ||
| README | ||
The PostgreSQL contrib tree
---------------------------
This subtree contains porting tools, analysis utilities, and plug-in
features that are not part of the core PostgreSQL system, mainly
because they address a limited audience or are too experimental to be
part of the main source tree. This does not preclude their
usefulness.
User documentation for each module appears in the main SGML
documentation.
When building from the source distribution, these modules are not
built automatically, unless you build the "world" target. You can
also build and install them all by running "make all" and "make
install" in this directory; or to build and install just one selected
module, do the same in that module's subdirectory.
Some directories supply new user-defined functions, operators, or
types. To make use of one of these modules, after you have installed
the code you need to register the new SQL objects in the database
system by executing a CREATE EXTENSION command. In a fresh database,
you can simply do
CREATE EXTENSION module_name;
See the PostgreSQL documentation for more information about this
procedure.