diff options
Diffstat (limited to 'src/backend/optimizer/path/costsize.c')
| -rw-r--r-- | src/backend/optimizer/path/costsize.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 355db7f684..1f8dfa8547 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -59,7 +59,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.216 2010/02/26 02:00:44 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.217 2010/04/19 00:55:25 rhaas Exp $ * *------------------------------------------------------------------------- */ @@ -114,6 +114,7 @@ bool enable_tidscan = true; bool enable_sort = true; bool enable_hashagg = true; bool enable_nestloop = true; +bool enable_material = true; bool enable_mergejoin = true; bool enable_hashjoin = true; @@ -1852,8 +1853,11 @@ cost_mergejoin(MergePath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo) mat_inner_cost = inner_run_cost + cpu_operator_cost * inner_path_rows * rescanratio; - /* Prefer materializing if it looks cheaper */ - if (mat_inner_cost < bare_inner_cost) + /* + * Prefer materializing if it looks cheaper, unless the user has asked + * to suppress materialization. + */ + if (enable_material && mat_inner_cost < bare_inner_cost) path->materialize_inner = true; /* @@ -1867,6 +1871,10 @@ cost_mergejoin(MergePath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo) * merge joins can *preserve* the order of their inputs, so they can be * selected as the input of a mergejoin, and they don't support * mark/restore at present. + * + * We don't test the value of enable_material here, because materialization + * is required for correctness in this case, and turning it off does not + * entitle us to deliver an invalid plan. */ else if (innersortkeys == NIL && !ExecSupportsMarkRestore(inner_path->pathtype)) @@ -1878,8 +1886,11 @@ cost_mergejoin(MergePath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo) * pass can be done on-the-fly if it doesn't have to support mark/restore. * We don't try to adjust the cost estimates for this consideration, * though. + * + * Since materialization is a performance optimization in this case, rather + * than necessary for correctness, we skip it if enable_material is off. */ - else if (innersortkeys != NIL && + else if (enable_material && innersortkeys != NIL && relation_byte_size(inner_path_rows, inner_path->parent->width) > (work_mem * 1024L)) path->materialize_inner = true; |
