@ -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 ;