Repository: incubator-trafodion Updated Branches: refs/heads/master 7072c24fa -> e3c7928af
fix JIRA 1654 for Trafodion Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/f8ff39c8 Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/f8ff39c8 Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/f8ff39c8 Branch: refs/heads/master Commit: f8ff39c86fe95cd2889aab94aa513c46338d4517 Parents: 80d6cff Author: Qifan Chen <[email protected]> Authored: Mon Nov 30 14:55:20 2015 +0000 Committer: Qifan Chen <[email protected]> Committed: Mon Nov 30 14:55:20 2015 +0000 ---------------------------------------------------------------------- core/sql/optimizer/ScanOptimizer.cpp | 63 ++++++++++++++++++++++++++++--- core/sql/sqlcomp/DefaultConstants.h | 14 ++++++- core/sql/sqlcomp/nadefaults.cpp | 6 ++- 3 files changed, 75 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/f8ff39c8/core/sql/optimizer/ScanOptimizer.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/ScanOptimizer.cpp b/core/sql/optimizer/ScanOptimizer.cpp index 65ec12a..6e60dc8 100644 --- a/core/sql/optimizer/ScanOptimizer.cpp +++ b/core/sql/optimizer/ScanOptimizer.cpp @@ -317,7 +317,14 @@ void MdamTrace::setLevel(enum MdamTraceLevel l) #endif // if MDAM_TRACE // LCOV_EXCL_STOP -static NABoolean checkMDAMadditionalRestriction(const ColumnOrderList& keyPredsByCol,const CollIndex& lastColumnPosition, CollIndex& noOfmissingKeyColumns, CollIndex& presentKeyColumns) +enum restrictCheckStrategy { MAJORITY_WITH_PREDICATES=1, TOTAL_UECS=2, BOTH=3 }; + +static NABoolean checkMDAMadditionalRestriction( + const ColumnOrderList& keyPredsByCol, + const CollIndex& lastColumnPosition, + const Histograms& hist, + restrictCheckStrategy strategy, + CollIndex& noOfmissingKeyColumns, CollIndex& presentKeyColumns) { KeyColumns::KeyColumn::KeyColumnType typeOfRange = KeyColumns::KeyColumn::EMPTY; CollIndex index = 0; @@ -331,9 +338,22 @@ static NABoolean checkMDAMadditionalRestriction(const ColumnOrderList& keyPredsB if ( mtd_mdam_uec_threshold < 0 ) checkLeadingDivColumns = FALSE; + CostScalar totalRC = hist.getRowCount().getCeiling(); + + float totalUEC_threshold = 1; + + Lng32 minRC = (ActiveSchemaDB()->getDefaults()).getAsLong(MDAM_TOTAL_UEC_CHECK_MIN_RC_THRESHOLD); + + if ( totalRC > minRC ) + (ActiveSchemaDB()->getDefaults()).getFloat(MDAM_TOTAL_UEC_CHECK_UEC_THRESHOLD, totalUEC_threshold); + + totalUEC_threshold *= totalRC.getValue(); + NABoolean isLeadingDivisionColumn = FALSE; NABoolean isLeadingSaltColumn = FALSE; + CostScalar totalUecsForKeylessKeyColumns = 1; + for (index = 0; index < lastColumnPosition; index++) { if (keyPredsByCol.getPredicateExpressionPtr(index) != NULL) @@ -367,6 +387,11 @@ static NABoolean checkMDAMadditionalRestriction(const ColumnOrderList& keyPredsB ) noOfmissingKeyColumns++; + // accumulate the product of uecs for columns without predicates + + totalUecsForKeylessKeyColumns *= hist.getColStatsForColumn( + keyPredsByCol.getKeyColumnId(index)).getTotalUec().getCeiling(); + } else { checkLeadingDivColumns = FALSE; @@ -374,8 +399,21 @@ static NABoolean checkMDAMadditionalRestriction(const ColumnOrderList& keyPredsB } } - if(presentKeyColumns > noOfmissingKeyColumns) return TRUE; - return FALSE; + switch ( strategy ) { + case MAJORITY_WITH_PREDICATES: + return (presentKeyColumns > noOfmissingKeyColumns); + + case TOTAL_UECS: + return ( totalUecsForKeylessKeyColumns < totalUEC_threshold ); + + case BOTH: + return ( presentKeyColumns > noOfmissingKeyColumns && + totalUecsForKeylessKeyColumns < totalUEC_threshold ); + + default: + return FALSE; + } + return FALSE; } // stack allocated only @@ -8710,12 +8748,25 @@ void MDAMCostWA::computeDisjunct() CollIndex noOfmissingKeyColumnsTot = 0; CollIndex presentKeyColumnsTot = 0; + + + const IndexDesc *idesc = optimizer_.getFileScan().getIndexDesc(); + const ColStatDescList& csdl = idesc->getPrimaryTableDesc()->getTableColStats(); + Histograms hist(csdl); + + Lng32 checkOption = (ActiveSchemaDB()->getDefaults()).getAsLong(MDAM_APPLY_RESTRICTION_CHECK); + if(CURRSTMT_OPTDEFAULTS->indexEliminationLevel() != OptDefaults::MINIMUM && (!mdamForced_) && (CmpCommon::getDefault(RANGESPEC_TRANSFORMATION) == DF_ON ) - && (CmpCommon::getDefault(MDAM_APPLY_RESTRICTION_CHECK) == DF_ON ) - && - (!checkMDAMadditionalRestriction(keyPredsByCol,optimizer_.computeLastKeyColumnOfDisjunct(keyPredsByCol),noOfmissingKeyColumnsTot,presentKeyColumnsTot)) + && checkOption >= 1 + && (!checkMDAMadditionalRestriction( + keyPredsByCol, + optimizer_.computeLastKeyColumnOfDisjunct(keyPredsByCol), + hist, + (restrictCheckStrategy)checkOption, + noOfmissingKeyColumnsTot, + presentKeyColumnsTot)) ) { http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/f8ff39c8/core/sql/sqlcomp/DefaultConstants.h ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/DefaultConstants.h b/core/sql/sqlcomp/DefaultConstants.h index 07f58d0..1a988b4 100644 --- a/core/sql/sqlcomp/DefaultConstants.h +++ b/core/sql/sqlcomp/DefaultConstants.h @@ -3768,9 +3768,21 @@ enum DefaultConstants HBASE_UPDATE_COSTING, TRAF_LOAD_FLUSH_SIZE_IN_KB, - // decide if to apply the additional restriction check (majority of keys with predicates) + // Specify whic additional restriction check to apply + // 0: no check + // 1: apply majority of keys with predicates check + // 2: apply total UECs on keyless key columns check + // 3: apply both 1) and 2) MDAM_APPLY_RESTRICTION_CHECK, + // A threshold of total UECs on keyless key columns above which MDAM will not be considered. + // The threshold is expressed as a percentage of the total RC. + MDAM_TOTAL_UEC_CHECK_UEC_THRESHOLD, + + // A threshold of minitmal RC above which the above total UEC check will be applied. + MDAM_TOTAL_UEC_CHECK_MIN_RC_THRESHOLD, + + // This enum constant must be the LAST one in the list; it's a count, // not an Attribute (it's not IN DefaultDefaults; it's the SIZE of it)! __NUM_DEFAULT_ATTRIBUTES http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/f8ff39c8/core/sql/sqlcomp/nadefaults.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/nadefaults.cpp b/core/sql/sqlcomp/nadefaults.cpp index 4e11bf9..e63b685 100644 --- a/core/sql/sqlcomp/nadefaults.cpp +++ b/core/sql/sqlcomp/nadefaults.cpp @@ -2160,7 +2160,7 @@ SDDkwd__(ISO_MAPPING, (char *)SQLCHARSETSTRING_ISO88591), XDDflt__(MC_SKEW_SENSITIVITY_THRESHOLD, "0.1"), - DDkwd__(MDAM_APPLY_RESTRICTION_CHECK, "OFF"), + DDui___(MDAM_APPLY_RESTRICTION_CHECK, "2"), DDflt0_(MDAM_CPUCOST_NET_OVH, "2000."), @@ -2180,6 +2180,10 @@ SDDkwd__(ISO_MAPPING, (char *)SQLCHARSETSTRING_ISO88591), XDDkwd__(MDAM_SCAN_METHOD, "ON"), DDflt0_(MDAM_SELECTION_DEFAULT, "0.5"), + + DDflt0_(MDAM_TOTAL_UEC_CHECK_MIN_RC_THRESHOLD, "10000"), + DDflt0_(MDAM_TOTAL_UEC_CHECK_UEC_THRESHOLD, "0.01"), + DDkwd__(MDAM_TRACING, "OFF"), // controls the max. number of probes at which MDAM under NJ plan will be
