Repository: incubator-trafodion Updated Branches: refs/heads/master c6d0773cb -> 5316fee08
fix JIRA 1654 (rework) Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/c8d538da Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/c8d538da Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/c8d538da Branch: refs/heads/master Commit: c8d538da8d726d32700ef360451d46f2dd050b09 Parents: f8ff39c Author: Qifan Chen <[email protected]> Authored: Tue Dec 1 17:25:31 2015 +0000 Committer: Qifan Chen <[email protected]> Committed: Tue Dec 1 17:25:31 2015 +0000 ---------------------------------------------------------------------- core/sql/optimizer/ColStatDesc.h | 2 +- core/sql/optimizer/ScanOptimizer.cpp | 58 +++++++++++++++++++++++++------ core/sql/sqlcomp/nadefaults.cpp | 2 +- 3 files changed, 49 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/c8d538da/core/sql/optimizer/ColStatDesc.h ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/ColStatDesc.h b/core/sql/optimizer/ColStatDesc.h index 3ff5f96..4215cd9 100644 --- a/core/sql/optimizer/ColStatDesc.h +++ b/core/sql/optimizer/ColStatDesc.h @@ -93,7 +93,7 @@ public: // LCOV_EXCL_STOP // given a ValueIdSet of table columns, returns the stored groupUec (if - // it exists), else returns 0 + // it exists), else returns csMinusOne CostScalar lookup (const ValueIdSet & key) const ; void initializeMCUecForUniqueIndxes(TableDesc &table, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/c8d538da/core/sql/optimizer/ScanOptimizer.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/ScanOptimizer.cpp b/core/sql/optimizer/ScanOptimizer.cpp index 6e60dc8..c4e6ccc 100644 --- a/core/sql/optimizer/ScanOptimizer.cpp +++ b/core/sql/optimizer/ScanOptimizer.cpp @@ -352,7 +352,10 @@ static NABoolean checkMDAMadditionalRestriction( NABoolean isLeadingDivisionColumn = FALSE; NABoolean isLeadingSaltColumn = FALSE; - CostScalar totalUecsForKeylessKeyColumns = 1; + CostScalar totalUecsForPredicatelessKeyColumns = 1; + CostScalar totalUecsForCurrentPredicatelessKeyColumnGroup = 1; + + ValueIdSet currentPredicatelessKeyColumnGroup; for (index = 0; index < lastColumnPosition; index++) { @@ -366,15 +369,15 @@ static NABoolean checkMDAMadditionalRestriction( isLeadingDivisionColumn = FALSE; isLeadingSaltColumn = FALSE; + ValueId columnVid = keyPredsByCol.getKeyColumnId(index); + if ( checkLeadingDivColumns ) { // Check if the key column is a leading divisioning column - isLeadingDivisionColumn = - keyPredsByCol.getKeyColumnId(index).isDivisioningColumn(); + isLeadingDivisionColumn = columnVid.isDivisioningColumn(); // Check if the key column is a leading salted column - isLeadingSaltColumn = - keyPredsByCol.getKeyColumnId(index).isSaltColumn(); + isLeadingSaltColumn = columnVid.isSaltColumn(); } if (typeOfRange == KeyColumns::KeyColumn::EMPTY) { @@ -387,28 +390,61 @@ static NABoolean checkMDAMadditionalRestriction( ) noOfmissingKeyColumns++; - // accumulate the product of uecs for columns without predicates - - totalUecsForKeylessKeyColumns *= hist.getColStatsForColumn( - keyPredsByCol.getKeyColumnId(index)).getTotalUec().getCeiling(); + // accumulate the product of uecs for columns without predicates in the current + // group + totalUecsForCurrentPredicatelessKeyColumnGroup *= hist.getColStatsForColumn( + columnVid).getTotalUec().getCeiling(); + // accumulate the column valud Id at the same time for MC UEC lookup later on. + currentPredicatelessKeyColumnGroup.insert(columnVid); } else { checkLeadingDivColumns = FALSE; presentKeyColumns++; + // If the set of key columns without predicate is not empty, fetch the MC UEC + // for the entire set. If the MC UEC exists, replace the current accumualted + // total UEC with the MC UEC. + // + // We will set the set to empty so that the fetching MC UEC logic will not kick in + // until a new key column without predicates is seen. + if ( currentPredicatelessKeyColumnGroup.entries() > 0 ) { + + // fetch MC UEC from key coluymns for column set currentPredicatelessKeyColumnGroup + const MultiColumnUecList* MCUL = hist.getColStatDescList().getUecList(); + + ValueIdSet theLargestSubset = + MCUL->largestSubset(currentPredicatelessKeyColumnGroup.convertToBaseIds()); + + if ( theLargestSubset.entries() > 1 && + theLargestSubset.entries() == currentPredicatelessKeyColumnGroup.entries() ) + { + CostScalar mcUEC = MCUL->lookup(theLargestSubset); + + if ( mcUEC != csMinusOne ) + totalUecsForCurrentPredicatelessKeyColumnGroup = mcUEC; + } + + currentPredicatelessKeyColumnGroup.clear(); + } + + totalUecsForPredicatelessKeyColumns *= + totalUecsForCurrentPredicatelessKeyColumnGroup; + + totalUecsForCurrentPredicatelessKeyColumnGroup = 1; } } + switch ( strategy ) { case MAJORITY_WITH_PREDICATES: return (presentKeyColumns > noOfmissingKeyColumns); case TOTAL_UECS: - return ( totalUecsForKeylessKeyColumns < totalUEC_threshold ); + return ( totalUecsForPredicatelessKeyColumns < totalUEC_threshold ); case BOTH: return ( presentKeyColumns > noOfmissingKeyColumns && - totalUecsForKeylessKeyColumns < totalUEC_threshold ); + totalUecsForPredicatelessKeyColumns < totalUEC_threshold ); default: return FALSE; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/c8d538da/core/sql/sqlcomp/nadefaults.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/nadefaults.cpp b/core/sql/sqlcomp/nadefaults.cpp index e63b685..24b8681 100644 --- a/core/sql/sqlcomp/nadefaults.cpp +++ b/core/sql/sqlcomp/nadefaults.cpp @@ -2182,7 +2182,7 @@ SDDkwd__(ISO_MAPPING, (char *)SQLCHARSETSTRING_ISO88591), DDflt0_(MDAM_SELECTION_DEFAULT, "0.5"), DDflt0_(MDAM_TOTAL_UEC_CHECK_MIN_RC_THRESHOLD, "10000"), - DDflt0_(MDAM_TOTAL_UEC_CHECK_UEC_THRESHOLD, "0.01"), + DDflt0_(MDAM_TOTAL_UEC_CHECK_UEC_THRESHOLD, "0.2"), DDkwd__(MDAM_TRACING, "OFF"),
