From a07b2ca58b6804b8a261e674a159eb442362471a Mon Sep 17 00:00:00 2001 From: teodor Date: Tue, 22 Nov 2011 17:52:41 +0000 Subject: [PATCH] add plantuner.fix_empty_table GUC variable --- README.plantuner | 6 ++++++ plantuner.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/README.plantuner b/README.plantuner index 2d01f8e..49141c0 100644 --- a/README.plantuner +++ b/README.plantuner @@ -23,6 +23,12 @@ Motivation specific index(es), without dropping them, or to instruct planner to use specific index. + Next, for some workload PostgreSQL could be too pessimistic for + newly created tables and assumps much more rows in table than + it actually has. If plantuner.fix_empty_table GUC variable is set + to true then module will set to zero number of pages/tuples of + table which hasn't blocks in file. + Installation * Get latest source of plantuner from CVS Repository diff --git a/plantuner.c b/plantuner.c index 13ab9b9..96d679a 100644 --- a/plantuner.c +++ b/plantuner.c @@ -30,19 +30,23 @@ #include #include +#include #include #include #include #include +#include #include #include #include +#include PG_MODULE_MAGIC; static int nIndexesOut = 0; static Oid *indexesOut = NULL; get_relation_info_hook_type prevHook = NULL; +static bool fix_empty_table = false; static char *indexesOutStr = ""; @@ -160,6 +164,35 @@ indexFilter(PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo } } + if (fix_empty_table && rel) + { + + + } + +} + +static void +execPlantuner(PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel) { + Relation relation; + + relation = heap_open(relationObjectId, NoLock); + if (relation->rd_rel->relkind == RELKIND_RELATION) + { + if (fix_empty_table && RelationGetNumberOfBlocks(relation) == 0) + { + /* + * estimate_rel_size() could be too pessimistic for particular + * workload + */ + rel->pages = 0.0; + rel->tuples = 0.0; + } + + indexFilter(root, relationObjectId, inhparent, rel); + } + heap_close(relation, NoLock); + /* * Call next hook if it exists */ @@ -217,9 +250,28 @@ _PG_init(void) IndexFilterShow ); - if (get_relation_info_hook != indexFilter ) + DefineCustomBoolVariable( + "plantuner.fix_empty_table", + "Sets to zero estimations for empty tables", + "Sets to zero estimations for empty or newly created tables", + &fix_empty_table, +#if PG_VERSION_NUM >= 80400 + fix_empty_table, +#endif + PGC_USERSET, +#if PG_VERSION_NUM >= 80400 + GUC_NOT_IN_SAMPLE, +#if PG_VERSION_NUM >= 90100 + NULL, +#endif +#endif + NULL, + NULL + ); + + if (get_relation_info_hook != execPlantuner ) { prevHook = get_relation_info_hook; - get_relation_info_hook = indexFilter; + get_relation_info_hook = execPlantuner; } } -- 2.46.1