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"),
 

Reply via email to