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

Reply via email to