|
|
|
@ -882,7 +882,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_seqscan", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of sequential-scan plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_seqscan,
|
|
|
|
|
true,
|
|
|
|
@ -891,7 +892,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_indexscan", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of index-scan plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_indexscan,
|
|
|
|
|
true,
|
|
|
|
@ -900,7 +902,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_indexonlyscan", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of index-only-scan plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_indexonlyscan,
|
|
|
|
|
true,
|
|
|
|
@ -909,7 +912,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_bitmapscan", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of bitmap-scan plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_bitmapscan,
|
|
|
|
|
true,
|
|
|
|
@ -918,7 +922,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_tidscan", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of TID scan plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_tidscan,
|
|
|
|
|
true,
|
|
|
|
@ -927,7 +932,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_sort", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of explicit sort steps."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_sort,
|
|
|
|
|
true,
|
|
|
|
@ -936,7 +942,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_hashagg", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of hashed aggregation plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_hashagg,
|
|
|
|
|
true,
|
|
|
|
@ -945,7 +952,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_material", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of materialization."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_material,
|
|
|
|
|
true,
|
|
|
|
@ -954,7 +962,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_nestloop", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of nested-loop join plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_nestloop,
|
|
|
|
|
true,
|
|
|
|
@ -963,7 +972,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_mergejoin", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of merge join plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_mergejoin,
|
|
|
|
|
true,
|
|
|
|
@ -972,7 +982,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_hashjoin", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of hash join plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_hashjoin,
|
|
|
|
|
true,
|
|
|
|
@ -981,7 +992,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_gathermerge", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of gather merge plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_gathermerge,
|
|
|
|
|
true,
|
|
|
|
@ -990,7 +1002,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_partitionwise_join", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables partitionwise join."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_partitionwise_join,
|
|
|
|
|
false,
|
|
|
|
@ -999,7 +1012,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_partitionwise_aggregate", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables partitionwise aggregation and grouping."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_partitionwise_aggregate,
|
|
|
|
|
false,
|
|
|
|
@ -1008,7 +1022,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_parallel_append", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of parallel append plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_parallel_append,
|
|
|
|
|
true,
|
|
|
|
@ -1017,7 +1032,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"enable_parallel_hash", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enables the planner's use of parallel hash plans."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_parallel_hash,
|
|
|
|
|
true,
|
|
|
|
@ -1028,7 +1044,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
gettext_noop("Enable plan-time and run-time partition pruning."),
|
|
|
|
|
gettext_noop("Allows the query planner and executor to compare partition "
|
|
|
|
|
"bounds to conditions in the query to determine which "
|
|
|
|
|
"partitions must be scanned.")
|
|
|
|
|
"partitions must be scanned."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_partition_pruning,
|
|
|
|
|
true,
|
|
|
|
@ -1038,7 +1055,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{"geqo", PGC_USERSET, QUERY_TUNING_GEQO,
|
|
|
|
|
gettext_noop("Enables genetic query optimization."),
|
|
|
|
|
gettext_noop("This algorithm attempts to do planning without "
|
|
|
|
|
"exhaustive searching.")
|
|
|
|
|
"exhaustive searching."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&enable_geqo,
|
|
|
|
|
true,
|
|
|
|
@ -1646,7 +1664,7 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
"optimize_bounded_sort", PGC_USERSET, QUERY_TUNING_METHOD,
|
|
|
|
|
gettext_noop("Enable bounded sorting using heap sort."),
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_NOT_IN_SAMPLE
|
|
|
|
|
GUC_NOT_IN_SAMPLE | GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&optimize_bounded_sort,
|
|
|
|
|
true,
|
|
|
|
@ -1837,7 +1855,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"parallel_leader_participation", PGC_USERSET, RESOURCES_ASYNCHRONOUS,
|
|
|
|
|
gettext_noop("Controls whether Gather and Gather Merge also run subplans."),
|
|
|
|
|
gettext_noop("Should gather nodes also run subplans, or just gather tuples?")
|
|
|
|
|
gettext_noop("Should gather nodes also run subplans, or just gather tuples?"),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
¶llel_leader_participation,
|
|
|
|
|
true,
|
|
|
|
@ -1847,7 +1866,8 @@ static struct config_bool ConfigureNamesBool[] =
|
|
|
|
|
{
|
|
|
|
|
{"jit", PGC_USERSET, QUERY_TUNING_OTHER,
|
|
|
|
|
gettext_noop("Allow JIT compilation."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&jit_enabled,
|
|
|
|
|
true,
|
|
|
|
@ -1976,7 +1996,8 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
"are not collapsed."),
|
|
|
|
|
gettext_noop("The planner will merge subqueries into upper "
|
|
|
|
|
"queries if the resulting FROM list would have no more than "
|
|
|
|
|
"this many items.")
|
|
|
|
|
"this many items."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&from_collapse_limit,
|
|
|
|
|
8, 1, INT_MAX,
|
|
|
|
@ -1988,7 +2009,8 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
"constructs are not flattened."),
|
|
|
|
|
gettext_noop("The planner will flatten explicit JOIN "
|
|
|
|
|
"constructs into lists of FROM items whenever a "
|
|
|
|
|
"list of no more than this many items would result.")
|
|
|
|
|
"list of no more than this many items would result."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&join_collapse_limit,
|
|
|
|
|
8, 1, INT_MAX,
|
|
|
|
@ -1997,7 +2019,8 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
{
|
|
|
|
|
{"geqo_threshold", PGC_USERSET, QUERY_TUNING_GEQO,
|
|
|
|
|
gettext_noop("Sets the threshold of FROM items beyond which GEQO is used."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&geqo_threshold,
|
|
|
|
|
12, 2, INT_MAX,
|
|
|
|
@ -2006,7 +2029,8 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
{
|
|
|
|
|
{"geqo_effort", PGC_USERSET, QUERY_TUNING_GEQO,
|
|
|
|
|
gettext_noop("GEQO: effort is used to set the default for other GEQO parameters."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&Geqo_effort,
|
|
|
|
|
DEFAULT_GEQO_EFFORT, MIN_GEQO_EFFORT, MAX_GEQO_EFFORT,
|
|
|
|
@ -2015,7 +2039,8 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
{
|
|
|
|
|
{"geqo_pool_size", PGC_USERSET, QUERY_TUNING_GEQO,
|
|
|
|
|
gettext_noop("GEQO: number of individuals in the population."),
|
|
|
|
|
gettext_noop("Zero selects a suitable default value.")
|
|
|
|
|
gettext_noop("Zero selects a suitable default value."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&Geqo_pool_size,
|
|
|
|
|
0, 0, INT_MAX,
|
|
|
|
@ -2024,7 +2049,8 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
{
|
|
|
|
|
{"geqo_generations", PGC_USERSET, QUERY_TUNING_GEQO,
|
|
|
|
|
gettext_noop("GEQO: number of iterations of the algorithm."),
|
|
|
|
|
gettext_noop("Zero selects a suitable default value.")
|
|
|
|
|
gettext_noop("Zero selects a suitable default value."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&Geqo_generations,
|
|
|
|
|
0, 0, INT_MAX,
|
|
|
|
@ -2138,7 +2164,7 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
{"temp_buffers", PGC_USERSET, RESOURCES_MEM,
|
|
|
|
|
gettext_noop("Sets the maximum number of temporary buffers used by each session."),
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_UNIT_BLOCKS
|
|
|
|
|
GUC_UNIT_BLOCKS | GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&num_temp_buffers,
|
|
|
|
|
1024, 100, INT_MAX / 2,
|
|
|
|
@ -2205,7 +2231,7 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
gettext_noop("This much memory can be used by each internal "
|
|
|
|
|
"sort operation and hash table before switching to "
|
|
|
|
|
"temporary disk files."),
|
|
|
|
|
GUC_UNIT_KB
|
|
|
|
|
GUC_UNIT_KB | GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&work_mem,
|
|
|
|
|
4096, 64, MAX_KILOBYTES,
|
|
|
|
@ -2734,7 +2760,8 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
PGC_USERSET,
|
|
|
|
|
RESOURCES_ASYNCHRONOUS,
|
|
|
|
|
gettext_noop("Number of simultaneous requests that can be handled efficiently by the disk subsystem."),
|
|
|
|
|
gettext_noop("For RAID arrays, this should be approximately the number of drive spindles in the array.")
|
|
|
|
|
gettext_noop("For RAID arrays, this should be approximately the number of drive spindles in the array."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&effective_io_concurrency,
|
|
|
|
|
#ifdef USE_PREFETCH
|
|
|
|
@ -2979,7 +3006,8 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
{
|
|
|
|
|
{"max_parallel_workers_per_gather", PGC_USERSET, RESOURCES_ASYNCHRONOUS,
|
|
|
|
|
gettext_noop("Sets the maximum number of parallel processes per executor node."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&max_parallel_workers_per_gather,
|
|
|
|
|
2, 0, MAX_PARALLEL_WORKER_LIMIT,
|
|
|
|
@ -2989,7 +3017,8 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
{
|
|
|
|
|
{"max_parallel_workers", PGC_USERSET, RESOURCES_ASYNCHRONOUS,
|
|
|
|
|
gettext_noop("Sets the maximum number of parallel workers that can be active at one time."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&max_parallel_workers,
|
|
|
|
|
8, 0, MAX_PARALLEL_WORKER_LIMIT,
|
|
|
|
@ -3079,7 +3108,7 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
gettext_noop("Sets the planner's assumption about the total size of the data caches."),
|
|
|
|
|
gettext_noop("That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. "
|
|
|
|
|
"This is measured in disk pages, which are normally 8 kB each."),
|
|
|
|
|
GUC_UNIT_BLOCKS,
|
|
|
|
|
GUC_UNIT_BLOCKS | GUC_EXPLAIN,
|
|
|
|
|
},
|
|
|
|
|
&effective_cache_size,
|
|
|
|
|
DEFAULT_EFFECTIVE_CACHE_SIZE, 1, INT_MAX,
|
|
|
|
@ -3090,7 +3119,7 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
{"min_parallel_table_scan_size", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Sets the minimum amount of table data for a parallel scan."),
|
|
|
|
|
gettext_noop("If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered."),
|
|
|
|
|
GUC_UNIT_BLOCKS,
|
|
|
|
|
GUC_UNIT_BLOCKS | GUC_EXPLAIN,
|
|
|
|
|
},
|
|
|
|
|
&min_parallel_table_scan_size,
|
|
|
|
|
(8 * 1024 * 1024) / BLCKSZ, 0, INT_MAX / 3,
|
|
|
|
@ -3101,7 +3130,7 @@ static struct config_int ConfigureNamesInt[] =
|
|
|
|
|
{"min_parallel_index_scan_size", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Sets the minimum amount of index data for a parallel scan."),
|
|
|
|
|
gettext_noop("If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered."),
|
|
|
|
|
GUC_UNIT_BLOCKS,
|
|
|
|
|
GUC_UNIT_BLOCKS | GUC_EXPLAIN,
|
|
|
|
|
},
|
|
|
|
|
&min_parallel_index_scan_size,
|
|
|
|
|
(512 * 1024) / BLCKSZ, 0, INT_MAX / 3,
|
|
|
|
@ -3166,7 +3195,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{"seq_page_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Sets the planner's estimate of the cost of a "
|
|
|
|
|
"sequentially fetched disk page."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&seq_page_cost,
|
|
|
|
|
DEFAULT_SEQ_PAGE_COST, 0, DBL_MAX,
|
|
|
|
@ -3176,7 +3206,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{"random_page_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Sets the planner's estimate of the cost of a "
|
|
|
|
|
"nonsequentially fetched disk page."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&random_page_cost,
|
|
|
|
|
DEFAULT_RANDOM_PAGE_COST, 0, DBL_MAX,
|
|
|
|
@ -3186,7 +3217,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{"cpu_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Sets the planner's estimate of the cost of "
|
|
|
|
|
"processing each tuple (row)."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&cpu_tuple_cost,
|
|
|
|
|
DEFAULT_CPU_TUPLE_COST, 0, DBL_MAX,
|
|
|
|
@ -3196,7 +3228,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{"cpu_index_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Sets the planner's estimate of the cost of "
|
|
|
|
|
"processing each index entry during an index scan."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&cpu_index_tuple_cost,
|
|
|
|
|
DEFAULT_CPU_INDEX_TUPLE_COST, 0, DBL_MAX,
|
|
|
|
@ -3206,7 +3239,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{"cpu_operator_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Sets the planner's estimate of the cost of "
|
|
|
|
|
"processing each operator or function call."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&cpu_operator_cost,
|
|
|
|
|
DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX,
|
|
|
|
@ -3216,7 +3250,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{"parallel_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Sets the planner's estimate of the cost of "
|
|
|
|
|
"passing each tuple (row) from worker to master backend."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
¶llel_tuple_cost,
|
|
|
|
|
DEFAULT_PARALLEL_TUPLE_COST, 0, DBL_MAX,
|
|
|
|
@ -3226,7 +3261,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{"parallel_setup_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Sets the planner's estimate of the cost of "
|
|
|
|
|
"starting up worker processes for parallel query."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
¶llel_setup_cost,
|
|
|
|
|
DEFAULT_PARALLEL_SETUP_COST, 0, DBL_MAX,
|
|
|
|
@ -3236,7 +3272,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{
|
|
|
|
|
{"jit_above_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Perform JIT compilation if query is more expensive."),
|
|
|
|
|
gettext_noop("-1 disables JIT compilation.")
|
|
|
|
|
gettext_noop("-1 disables JIT compilation."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&jit_above_cost,
|
|
|
|
|
100000, -1, DBL_MAX,
|
|
|
|
@ -3246,7 +3283,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{
|
|
|
|
|
{"jit_optimize_above_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Optimize JITed functions if query is more expensive."),
|
|
|
|
|
gettext_noop("-1 disables optimization.")
|
|
|
|
|
gettext_noop("-1 disables optimization."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&jit_optimize_above_cost,
|
|
|
|
|
500000, -1, DBL_MAX,
|
|
|
|
@ -3256,7 +3294,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{
|
|
|
|
|
{"jit_inline_above_cost", PGC_USERSET, QUERY_TUNING_COST,
|
|
|
|
|
gettext_noop("Perform JIT inlining if query is more expensive."),
|
|
|
|
|
gettext_noop("-1 disables inlining.")
|
|
|
|
|
gettext_noop("-1 disables inlining."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&jit_inline_above_cost,
|
|
|
|
|
500000, -1, DBL_MAX,
|
|
|
|
@ -3267,7 +3306,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{"cursor_tuple_fraction", PGC_USERSET, QUERY_TUNING_OTHER,
|
|
|
|
|
gettext_noop("Sets the planner's estimate of the fraction of "
|
|
|
|
|
"a cursor's rows that will be retrieved."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&cursor_tuple_fraction,
|
|
|
|
|
DEFAULT_CURSOR_TUPLE_FRACTION, 0.0, 1.0,
|
|
|
|
@ -3277,7 +3317,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{
|
|
|
|
|
{"geqo_selection_bias", PGC_USERSET, QUERY_TUNING_GEQO,
|
|
|
|
|
gettext_noop("GEQO: selective pressure within the population."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&Geqo_selection_bias,
|
|
|
|
|
DEFAULT_GEQO_SELECTION_BIAS,
|
|
|
|
@ -3287,7 +3328,8 @@ static struct config_real ConfigureNamesReal[] =
|
|
|
|
|
{
|
|
|
|
|
{"geqo_seed", PGC_USERSET, QUERY_TUNING_GEQO,
|
|
|
|
|
gettext_noop("GEQO: seed for random path selection."),
|
|
|
|
|
NULL
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&Geqo_seed,
|
|
|
|
|
0.0, 0.0, 1.0,
|
|
|
|
@ -3747,7 +3789,7 @@ static struct config_string ConfigureNamesString[] =
|
|
|
|
|
{"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,
|
|
|
|
|
gettext_noop("Sets the schema search order for names that are not schema-qualified."),
|
|
|
|
|
NULL,
|
|
|
|
|
GUC_LIST_INPUT | GUC_LIST_QUOTE
|
|
|
|
|
GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&namespace_search_path,
|
|
|
|
|
"\"$user\", public",
|
|
|
|
@ -4200,7 +4242,8 @@ static struct config_enum ConfigureNamesEnum[] =
|
|
|
|
|
{"constraint_exclusion", PGC_USERSET, QUERY_TUNING_OTHER,
|
|
|
|
|
gettext_noop("Enables the planner to use constraints to optimize queries."),
|
|
|
|
|
gettext_noop("Table scans will be skipped if their constraints"
|
|
|
|
|
" guarantee that no rows match the query.")
|
|
|
|
|
" guarantee that no rows match the query."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&constraint_exclusion,
|
|
|
|
|
CONSTRAINT_EXCLUSION_PARTITION, constraint_exclusion_options,
|
|
|
|
@ -4436,7 +4479,8 @@ static struct config_enum ConfigureNamesEnum[] =
|
|
|
|
|
{
|
|
|
|
|
{"force_parallel_mode", PGC_USERSET, QUERY_TUNING_OTHER,
|
|
|
|
|
gettext_noop("Forces use of parallel query facilities."),
|
|
|
|
|
gettext_noop("If possible, run query using a parallel worker and with parallel restrictions.")
|
|
|
|
|
gettext_noop("If possible, run query using a parallel worker and with parallel restrictions."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&force_parallel_mode,
|
|
|
|
|
FORCE_PARALLEL_OFF, force_parallel_mode_options,
|
|
|
|
@ -4460,7 +4504,8 @@ static struct config_enum ConfigureNamesEnum[] =
|
|
|
|
|
gettext_noop("Controls the planner's selection of custom or generic plan."),
|
|
|
|
|
gettext_noop("Prepared statements can have custom and generic plans, and the planner "
|
|
|
|
|
"will attempt to choose which is better. This can be set to override "
|
|
|
|
|
"the default behavior.")
|
|
|
|
|
"the default behavior."),
|
|
|
|
|
GUC_EXPLAIN
|
|
|
|
|
},
|
|
|
|
|
&plan_cache_mode,
|
|
|
|
|
PLAN_CACHE_MODE_AUTO, plan_cache_mode_options,
|
|
|
|
@ -4521,6 +4566,9 @@ static struct config_generic **guc_variables;
|
|
|
|
|
/* Current number of variables contained in the vector */
|
|
|
|
|
static int num_guc_variables;
|
|
|
|
|
|
|
|
|
|
/* Current number of variables marked with GUC_EXPLAIN */
|
|
|
|
|
static int num_guc_explain_variables;
|
|
|
|
|
|
|
|
|
|
/* Vector capacity */
|
|
|
|
|
static int size_guc_variables;
|
|
|
|
|
|
|
|
|
@ -4784,6 +4832,7 @@ build_guc_variables(void)
|
|
|
|
|
{
|
|
|
|
|
int size_vars;
|
|
|
|
|
int num_vars = 0;
|
|
|
|
|
int num_explain_vars = 0;
|
|
|
|
|
struct config_generic **guc_vars;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
@ -4794,6 +4843,9 @@ build_guc_variables(void)
|
|
|
|
|
/* Rather than requiring vartype to be filled in by hand, do this: */
|
|
|
|
|
conf->gen.vartype = PGC_BOOL;
|
|
|
|
|
num_vars++;
|
|
|
|
|
|
|
|
|
|
if (conf->gen.flags & GUC_EXPLAIN)
|
|
|
|
|
num_explain_vars++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; ConfigureNamesInt[i].gen.name; i++)
|
|
|
|
@ -4802,6 +4854,9 @@ build_guc_variables(void)
|
|
|
|
|
|
|
|
|
|
conf->gen.vartype = PGC_INT;
|
|
|
|
|
num_vars++;
|
|
|
|
|
|
|
|
|
|
if (conf->gen.flags & GUC_EXPLAIN)
|
|
|
|
|
num_explain_vars++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; ConfigureNamesReal[i].gen.name; i++)
|
|
|
|
@ -4810,6 +4865,9 @@ build_guc_variables(void)
|
|
|
|
|
|
|
|
|
|
conf->gen.vartype = PGC_REAL;
|
|
|
|
|
num_vars++;
|
|
|
|
|
|
|
|
|
|
if (conf->gen.flags & GUC_EXPLAIN)
|
|
|
|
|
num_explain_vars++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; ConfigureNamesString[i].gen.name; i++)
|
|
|
|
@ -4818,6 +4876,9 @@ build_guc_variables(void)
|
|
|
|
|
|
|
|
|
|
conf->gen.vartype = PGC_STRING;
|
|
|
|
|
num_vars++;
|
|
|
|
|
|
|
|
|
|
if (conf->gen.flags & GUC_EXPLAIN)
|
|
|
|
|
num_explain_vars++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; ConfigureNamesEnum[i].gen.name; i++)
|
|
|
|
@ -4826,6 +4887,9 @@ build_guc_variables(void)
|
|
|
|
|
|
|
|
|
|
conf->gen.vartype = PGC_ENUM;
|
|
|
|
|
num_vars++;
|
|
|
|
|
|
|
|
|
|
if (conf->gen.flags & GUC_EXPLAIN)
|
|
|
|
|
num_explain_vars++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -4857,6 +4921,7 @@ build_guc_variables(void)
|
|
|
|
|
free(guc_variables);
|
|
|
|
|
guc_variables = guc_vars;
|
|
|
|
|
num_guc_variables = num_vars;
|
|
|
|
|
num_guc_explain_variables = num_explain_vars;
|
|
|
|
|
size_guc_variables = size_vars;
|
|
|
|
|
qsort((void *) guc_variables, num_guc_variables,
|
|
|
|
|
sizeof(struct config_generic *), guc_var_compare);
|
|
|
|
@ -8807,6 +8872,99 @@ ShowAllGUCConfig(DestReceiver *dest)
|
|
|
|
|
end_tup_output(tstate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Returns an array of modified GUC options to show in EXPLAIN. Only options
|
|
|
|
|
* related to query planning (marked with GUC_EXPLAIN), with values different
|
|
|
|
|
* from built-in defaults.
|
|
|
|
|
*/
|
|
|
|
|
struct config_generic **
|
|
|
|
|
get_explain_guc_options(int *num)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
struct config_generic **result;
|
|
|
|
|
|
|
|
|
|
*num = 0;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Allocate enough space to fit all GUC_EXPLAIN options. We may not
|
|
|
|
|
* need all the space, but there are fairly few such options so we
|
|
|
|
|
* don't waste a lot of memory.
|
|
|
|
|
*/
|
|
|
|
|
result = palloc(sizeof(struct config_generic *) * num_guc_explain_variables);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < num_guc_variables; i++)
|
|
|
|
|
{
|
|
|
|
|
bool modified;
|
|
|
|
|
struct config_generic *conf = guc_variables[i];
|
|
|
|
|
|
|
|
|
|
/* return only options visible to the user */
|
|
|
|
|
if ((conf->flags & GUC_NO_SHOW_ALL) ||
|
|
|
|
|
((conf->flags & GUC_SUPERUSER_ONLY) &&
|
|
|
|
|
!is_member_of_role(GetUserId(), DEFAULT_ROLE_READ_ALL_SETTINGS)))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* only parameters explicitly marked for inclusion in explain */
|
|
|
|
|
if (!(conf->flags & GUC_EXPLAIN))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* return only options that were modified (w.r.t. config file) */
|
|
|
|
|
modified = false;
|
|
|
|
|
|
|
|
|
|
switch (conf->vartype)
|
|
|
|
|
{
|
|
|
|
|
case PGC_BOOL:
|
|
|
|
|
{
|
|
|
|
|
struct config_bool *lconf = (struct config_bool *) conf;
|
|
|
|
|
modified = (lconf->boot_val != *(lconf->variable));
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PGC_INT:
|
|
|
|
|
{
|
|
|
|
|
struct config_int *lconf = (struct config_int *) conf;
|
|
|
|
|
modified = (lconf->boot_val != *(lconf->variable));
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PGC_REAL:
|
|
|
|
|
{
|
|
|
|
|
struct config_real *lconf = (struct config_real *) conf;
|
|
|
|
|
modified = (lconf->boot_val != *(lconf->variable));
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PGC_STRING:
|
|
|
|
|
{
|
|
|
|
|
struct config_string *lconf = (struct config_string *) conf;
|
|
|
|
|
modified = (strcmp(lconf->boot_val, *(lconf->variable)) != 0);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PGC_ENUM:
|
|
|
|
|
{
|
|
|
|
|
struct config_enum *lconf = (struct config_enum *) conf;
|
|
|
|
|
modified = (lconf->boot_val != *(lconf->variable));
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
elog(ERROR, "unexcpected GUC type: %d", conf->vartype);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* skip GUC variables that match the built-in default */
|
|
|
|
|
if (!modified)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* assign to the values array */
|
|
|
|
|
result[*num] = conf;
|
|
|
|
|
*num = *num + 1;
|
|
|
|
|
|
|
|
|
|
Assert(*num <= num_guc_explain_variables);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Return GUC variable value by name; optionally return canonical form of
|
|
|
|
|
* name. If the GUC is unset, then throw an error unless missing_ok is true,
|
|
|
|
|