From a828e1c1af5df7339f7bf8d46d268b351cf56c3b Mon Sep 17 00:00:00 2001 From: Haisheng Yuan Date: Mon, 8 Feb 2016 18:24:22 -0800 Subject: [PATCH] HAWQ-404. Add sort during INSERT of append only row oriented partition tables The new added GUC 'optimizer_parts_to_force_sort_on_insert' implies minimum number of partitions required for sorting tuples during insertion in an append only row-oriented partitioned table. --- src/backend/gpopt/ivy.xml | 2 +- .../gpopt/translate/CTranslatorRelcacheToDXL.cpp | 9 +++++++++ src/backend/gpopt/utils/COptTasks.cpp | 4 +++- src/backend/utils/misc/guc.c | 11 +++++++++++ src/include/gpopt/translate/CTranslatorUtils.h | 4 ---- src/include/utils/guc.h | 1 + 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/backend/gpopt/ivy.xml b/src/backend/gpopt/ivy.xml index db5c89fc95..3cc31370dd 100644 --- a/src/backend/gpopt/ivy.xml +++ b/src/backend/gpopt/ivy.xml @@ -38,7 +38,7 @@ under the License. - + diff --git a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp index 80a81ee6c9..8cb468a4e9 100644 --- a/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorRelcacheToDXL.cpp @@ -597,6 +597,7 @@ CTranslatorRelcacheToDXL::Pmdrel DrgPmdid *pdrgpmdidIndexes = NULL; DrgPmdid *pdrgpmdidTriggers = NULL; DrgPul *pdrgpulPartKeys = NULL; + ULONG ulLeafPartitions = 0; BOOL fConvertHashToRandom = false; DrgPdrgPul *pdrgpdrgpulKeys = NULL; DrgPmdid *pdrgpmdidCheckConstraints = NULL; @@ -652,6 +653,13 @@ CTranslatorRelcacheToDXL::Pmdrel erelstorage = IMDRelation::ErelstorageAppendOnlyParquet; } } + + // get number of leaf partitions + if (gpdb::FRelPartIsRoot(oid)) + { + ulLeafPartitions = gpdb::UlLeafPartitions(oid); + } + // get key sets BOOL fAddDefaultKeys = FHasSystemColumns(rel->rd_rel->relkind); pdrgpdrgpulKeys = PdrgpdrgpulKeys(pmp, oid, fAddDefaultKeys, fPartitioned, pulAttnoMapping); @@ -722,6 +730,7 @@ CTranslatorRelcacheToDXL::Pmdrel pdrgpmdcol, pdrpulDistrCols, pdrgpulPartKeys, + ulLeafPartitions, fConvertHashToRandom, pdrgpdrgpulKeys, pdrgpmdidIndexes, diff --git a/src/backend/gpopt/utils/COptTasks.cpp b/src/backend/gpopt/utils/COptTasks.cpp index 893cde2aa8..4d10d395f4 100644 --- a/src/backend/gpopt/utils/COptTasks.cpp +++ b/src/backend/gpopt/utils/COptTasks.cpp @@ -774,13 +774,15 @@ COptTasks::PoconfCreate DOUBLE dDampingFactorGroupBy = (DOUBLE) optimizer_damping_factor_groupby; ULONG ulCTEInliningCutoff = (ULONG) optimizer_cte_inlining_bound; + ULONG ulPartsToForceSortOnInsert = (ULONG) optimizer_parts_to_force_sort_on_insert; return GPOS_NEW(pmp) COptimizerConfig ( GPOS_NEW(pmp) CEnumeratorConfig(pmp, ullPlanId, ullSamples, dCostThreshold), GPOS_NEW(pmp) CStatisticsConfig(pmp, dDampingFactorFilter, dDampingFactorJoin, dDampingFactorGroupBy), GPOS_NEW(pmp) CCTEConfig(ulCTEInliningCutoff), - pcm + pcm, + GPOS_NEW(pmp) CHint(ulPartsToForceSortOnInsert) ); } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index a8f3f37ce1..20c9e485a6 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -762,6 +762,7 @@ bool optimizer_multilevel_partitioning; bool optimizer_enable_derive_stats_all_groups; bool optimizer_explain_show_status; bool optimizer_prefer_scalar_dqa_multistage_agg; +int optimizer_parts_to_force_sort_on_insert; /* Security */ bool gp_reject_internal_tcp_conn = true; @@ -6145,6 +6146,16 @@ static struct config_int ConfigureNamesInt[] = 0, 0, INT_MAX, NULL, NULL }, + { + {"optimizer_parts_to_force_sort_on_insert", PGC_USERSET, DEVELOPER_OPTIONS, + gettext_noop("Minimum number of partitions required to force sorting tuples during insertion in an append only row-oriented partitioned table"), + NULL, + GUC_NOT_IN_SAMPLE + }, + &optimizer_parts_to_force_sort_on_insert, + INT_MAX, 0, INT_MAX, NULL, NULL + }, + { {"pxf_stat_max_fragments", PGC_USERSET, EXTERNAL_TABLES, gettext_noop("Max number of fragments to be sampled during ANALYZE on a PXF table."), diff --git a/src/include/gpopt/translate/CTranslatorUtils.h b/src/include/gpopt/translate/CTranslatorUtils.h index 1f8776abfb..d0a0f715e0 100644 --- a/src/include/gpopt/translate/CTranslatorUtils.h +++ b/src/include/gpopt/translate/CTranslatorUtils.h @@ -70,10 +70,6 @@ namespace gpdxl { using namespace gpopt; - // hash maps mapping INT -> ULONG - typedef CHashMap, gpos::FEqual, - CleanupDelete, CleanupDelete > HMIUl; - //--------------------------------------------------------------------------- // @class: // CTranslatorUtils diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index befeaf606f..475cae183b 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -434,6 +434,7 @@ extern bool optimizer_multilevel_partitioning; extern bool optimizer_enable_derive_stats_all_groups; extern bool optimizer_explain_show_status; extern bool optimizer_prefer_scalar_dqa_multistage_agg; +extern int optimizer_parts_to_force_sort_on_insert; /** * Enable logging of DPE match in optimizer.