You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
MCOL-4589 Follow up on MCOL-4543 to optimize out non-referenced
columns from a subquery involving UNIONs.
This commit is contained in:
@ -57,7 +57,7 @@ void derivedTableOptimization(THD* thd, SCSEP& csep)
|
|||||||
|
|
||||||
for (uint i = 0; i < derivedTbList.size(); i++)
|
for (uint i = 0; i < derivedTbList.size(); i++)
|
||||||
{
|
{
|
||||||
CalpontSelectExecutionPlan* plan = dynamic_cast<CalpontSelectExecutionPlan*>(derivedTbList[i].get());
|
CalpontSelectExecutionPlan* plan = reinterpret_cast<CalpontSelectExecutionPlan*>(derivedTbList[i].get());
|
||||||
CalpontSelectExecutionPlan::ReturnedColumnList cols = plan->returnedCols();
|
CalpontSelectExecutionPlan::ReturnedColumnList cols = plan->returnedCols();
|
||||||
vector<CalpontSelectExecutionPlan::ReturnedColumnList> unionColVec;
|
vector<CalpontSelectExecutionPlan::ReturnedColumnList> unionColVec;
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ void derivedTableOptimization(THD* thd, SCSEP& csep)
|
|||||||
for (uint j = 0; j < plan->unionVec().size(); j++)
|
for (uint j = 0; j < plan->unionVec().size(); j++)
|
||||||
{
|
{
|
||||||
unionColVec.push_back(
|
unionColVec.push_back(
|
||||||
dynamic_cast<CalpontSelectExecutionPlan*>(plan->unionVec()[j].get())->returnedCols());
|
reinterpret_cast<CalpontSelectExecutionPlan*>(plan->unionVec()[j].get())->returnedCols());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ void derivedTableOptimization(THD* thd, SCSEP& csep)
|
|||||||
|
|
||||||
for (uint j = 0; j < plan->unionVec().size(); j++)
|
for (uint j = 0; j < plan->unionVec().size(); j++)
|
||||||
{
|
{
|
||||||
if (dynamic_cast<CalpontSelectExecutionPlan*>(plan->unionVec()[j].get())->tableList().empty())
|
if (reinterpret_cast<CalpontSelectExecutionPlan*>(plan->unionVec()[j].get())->tableList().empty())
|
||||||
{
|
{
|
||||||
horizontalOptimization = false;
|
horizontalOptimization = false;
|
||||||
break;
|
break;
|
||||||
@ -111,6 +111,7 @@ void derivedTableOptimization(THD* thd, SCSEP& csep)
|
|||||||
// of the subquery in ExeMgr.
|
// of the subquery in ExeMgr.
|
||||||
// This will be addressed in future.
|
// This will be addressed in future.
|
||||||
CalpontSelectExecutionPlan::ReturnedColumnList nonConstCols;
|
CalpontSelectExecutionPlan::ReturnedColumnList nonConstCols;
|
||||||
|
vector<CalpontSelectExecutionPlan::ReturnedColumnList> nonConstUnionColVec(unionColVec.size());
|
||||||
|
|
||||||
int64_t lastNonConstIndex = -1;
|
int64_t lastNonConstIndex = -1;
|
||||||
|
|
||||||
@ -122,7 +123,7 @@ void derivedTableOptimization(THD* thd, SCSEP& csep)
|
|||||||
if (cols[i]->derivedRefCol())
|
if (cols[i]->derivedRefCol())
|
||||||
cols[i]->derivedRefCol()->decRefCount();
|
cols[i]->derivedRefCol()->decRefCount();
|
||||||
|
|
||||||
if ((lastNonConstIndex == -1) && unionColVec.empty())
|
if (lastNonConstIndex == -1)
|
||||||
{
|
{
|
||||||
SimpleColumn* sc = dynamic_cast<SimpleColumn*>(cols[i].get());
|
SimpleColumn* sc = dynamic_cast<SimpleColumn*>(cols[i].get());
|
||||||
|
|
||||||
@ -134,13 +135,28 @@ void derivedTableOptimization(THD* thd, SCSEP& csep)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
cols[i].reset(new ConstantColumn(val));
|
cols[i].reset(new ConstantColumn(val));
|
||||||
(dynamic_cast<ConstantColumn*>(cols[i].get()))->timeZone(thd->variables.time_zone->get_name()->ptr());
|
(reinterpret_cast<ConstantColumn*>(cols[i].get()))->timeZone(thd->variables.time_zone->get_name()->ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint j = 0; j < unionColVec.size(); j++)
|
for (uint j = 0; j < unionColVec.size(); j++)
|
||||||
{
|
{
|
||||||
unionColVec[j][i].reset(new ConstantColumn(val));
|
if (lastNonConstIndex == -1)
|
||||||
(dynamic_cast<ConstantColumn*>(unionColVec[j][i].get()))->timeZone(thd->variables.time_zone->get_name()->ptr());
|
{
|
||||||
|
CalpontSelectExecutionPlan* unionSubPlan =
|
||||||
|
reinterpret_cast<CalpontSelectExecutionPlan*>(plan->unionVec()[j].get());
|
||||||
|
|
||||||
|
SimpleColumn* sc = dynamic_cast<SimpleColumn*>(unionSubPlan->returnedCols()[i].get());
|
||||||
|
|
||||||
|
if (sc && (unionSubPlan->columnMap().count(sc->columnName()) == 1))
|
||||||
|
{
|
||||||
|
unionSubPlan->columnMap().erase(sc->columnName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unionColVec[j][i].reset(new ConstantColumn(val));
|
||||||
|
(reinterpret_cast<ConstantColumn*>(unionColVec[j][i].get()))->timeZone(thd->variables.time_zone->get_name()->ptr());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (lastNonConstIndex == -1)
|
else if (lastNonConstIndex == -1)
|
||||||
@ -155,27 +171,36 @@ void derivedTableOptimization(THD* thd, SCSEP& csep)
|
|||||||
if (!cols.empty())
|
if (!cols.empty())
|
||||||
{
|
{
|
||||||
cols[0].reset(new ConstantColumn(val));
|
cols[0].reset(new ConstantColumn(val));
|
||||||
(dynamic_cast<ConstantColumn*>(cols[0].get()))->timeZone(thd->variables.time_zone->get_name()->ptr());
|
(reinterpret_cast<ConstantColumn*>(cols[0].get()))->timeZone(thd->variables.time_zone->get_name()->ptr());
|
||||||
nonConstCols.push_back(cols[0]);
|
nonConstCols.push_back(cols[0]);
|
||||||
|
|
||||||
|
for (uint j = 0; j < unionColVec.size(); j++)
|
||||||
|
{
|
||||||
|
unionColVec[j][0].reset(new ConstantColumn(val));
|
||||||
|
(reinterpret_cast<ConstantColumn*>(unionColVec[j][0].get()))->timeZone(thd->variables.time_zone->get_name()->ptr());
|
||||||
|
nonConstUnionColVec[j].push_back(unionColVec[j][0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nonConstCols.assign(cols.begin(), cols.begin() + lastNonConstIndex + 1);
|
nonConstCols.assign(cols.begin(), cols.begin() + lastNonConstIndex + 1);
|
||||||
|
|
||||||
|
for (uint j = 0; j < unionColVec.size(); j++)
|
||||||
|
{
|
||||||
|
nonConstUnionColVec[j].assign(unionColVec[j].begin(), unionColVec[j].begin() + lastNonConstIndex + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set back
|
// set back
|
||||||
if (unionColVec.empty())
|
plan->returnedCols(nonConstCols);
|
||||||
{
|
|
||||||
plan->returnedCols(nonConstCols);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
plan->returnedCols(cols);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint j = 0; j < unionColVec.size(); j++)
|
for (uint j = 0; j < unionColVec.size(); j++)
|
||||||
dynamic_cast<CalpontSelectExecutionPlan*>(plan->unionVec()[j].get())->returnedCols(unionColVec[j]);
|
{
|
||||||
|
CalpontSelectExecutionPlan* unionSubPlan =
|
||||||
|
reinterpret_cast<CalpontSelectExecutionPlan*>(plan->unionVec()[j].get());
|
||||||
|
unionSubPlan->returnedCols(nonConstUnionColVec[j]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +235,7 @@ void derivedTableOptimization(THD* thd, SCSEP& csep)
|
|||||||
|
|
||||||
for (uint i = 0; i < derivedTbList.size(); i++)
|
for (uint i = 0; i < derivedTbList.size(); i++)
|
||||||
{
|
{
|
||||||
CalpontSelectExecutionPlan* plan = dynamic_cast<CalpontSelectExecutionPlan*>(derivedTbList[i].get());
|
CalpontSelectExecutionPlan* plan = reinterpret_cast<CalpontSelectExecutionPlan*>(derivedTbList[i].get());
|
||||||
CalpontSelectExecutionPlan::ReturnedColumnList derivedColList = plan->returnedCols();
|
CalpontSelectExecutionPlan::ReturnedColumnList derivedColList = plan->returnedCols();
|
||||||
mapIt = derivedTbFilterMap.find(plan->derivedTbAlias());
|
mapIt = derivedTbFilterMap.find(plan->derivedTbAlias());
|
||||||
|
|
||||||
@ -240,7 +265,7 @@ void derivedTableOptimization(THD* thd, SCSEP& csep)
|
|||||||
for (uint j = 0; j < plan->unionVec().size(); j++)
|
for (uint j = 0; j < plan->unionVec().size(); j++)
|
||||||
{
|
{
|
||||||
CalpontSelectExecutionPlan* unionPlan =
|
CalpontSelectExecutionPlan* unionPlan =
|
||||||
dynamic_cast<CalpontSelectExecutionPlan*>(plan->unionVec()[j].get());
|
reinterpret_cast<CalpontSelectExecutionPlan*>(plan->unionVec()[j].get());
|
||||||
CalpontSelectExecutionPlan::ReturnedColumnList unionColList = unionPlan->returnedCols();
|
CalpontSelectExecutionPlan::ReturnedColumnList unionColList = unionPlan->returnedCols();
|
||||||
ParseTree* mainFilterForUnion = new ParseTree();
|
ParseTree* mainFilterForUnion = new ParseTree();
|
||||||
mainFilterForUnion->copyTree(*(mapIt->second));
|
mainFilterForUnion->copyTree(*(mapIt->second));
|
||||||
|
@ -176,10 +176,59 @@ COUNT(a)
|
|||||||
SELECT COUNT(b) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q;
|
SELECT COUNT(b) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q;
|
||||||
COUNT(b)
|
COUNT(b)
|
||||||
10
|
10
|
||||||
|
SELECT COUNT(b), COUNT(a) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q;
|
||||||
|
COUNT(b) COUNT(a)
|
||||||
|
10 10
|
||||||
SELECT COUNT(a) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q GROUP BY b ORDER BY b;
|
SELECT COUNT(a) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q GROUP BY b ORDER BY b;
|
||||||
COUNT(a)
|
COUNT(a)
|
||||||
4
|
4
|
||||||
6
|
6
|
||||||
|
SELECT q1.a FROM (SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q1_1) q1 JOIN
|
||||||
|
(SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q2_1) q2 ON q1.a=q2.a ORDER BY 1;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
2
|
||||||
|
2
|
||||||
|
2
|
||||||
|
2
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
4
|
||||||
|
4
|
||||||
|
4
|
||||||
|
4
|
||||||
|
5
|
||||||
|
5
|
||||||
|
5
|
||||||
|
5
|
||||||
|
SELECT q1.a, q2.b FROM (SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q1_1) q1 JOIN
|
||||||
|
(SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q2_1) q2 ON q1.a=q2.a ORDER BY 2 desc, 1 asc;
|
||||||
|
a b
|
||||||
|
3 2
|
||||||
|
3 2
|
||||||
|
3 2
|
||||||
|
3 2
|
||||||
|
4 2
|
||||||
|
4 2
|
||||||
|
4 2
|
||||||
|
4 2
|
||||||
|
5 2
|
||||||
|
5 2
|
||||||
|
5 2
|
||||||
|
5 2
|
||||||
|
1 1
|
||||||
|
1 1
|
||||||
|
1 1
|
||||||
|
1 1
|
||||||
|
2 1
|
||||||
|
2 1
|
||||||
|
2 1
|
||||||
|
2 1
|
||||||
SELECT "123" FROM (SELECT * FROM t1) q GROUP BY b ORDER BY b;
|
SELECT "123" FROM (SELECT * FROM t1) q GROUP BY b ORDER BY b;
|
||||||
123
|
123
|
||||||
123
|
123
|
||||||
@ -188,4 +237,4 @@ SELECT "123" FROM (SELECT * FROM t1) q GROUP BY b;
|
|||||||
123
|
123
|
||||||
123
|
123
|
||||||
123
|
123
|
||||||
DROP DATABASE IF EXISTS mcol4543;
|
DROP DATABASE mcol4543;
|
||||||
|
@ -51,7 +51,12 @@ SELECT tab1.a, tab2.b FROM t1 tab1 JOIN (SELECT * FROM t1) tab2 ON tab1.a=tab2.a
|
|||||||
# Test subquery columns referenced/not-referenced when subqueries contain unions
|
# Test subquery columns referenced/not-referenced when subqueries contain unions
|
||||||
SELECT COUNT(a) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q;
|
SELECT COUNT(a) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q;
|
||||||
SELECT COUNT(b) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q;
|
SELECT COUNT(b) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q;
|
||||||
|
SELECT COUNT(b), COUNT(a) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q;
|
||||||
SELECT COUNT(a) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q GROUP BY b ORDER BY b;
|
SELECT COUNT(a) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q GROUP BY b ORDER BY b;
|
||||||
|
SELECT q1.a FROM (SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q1_1) q1 JOIN
|
||||||
|
(SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q2_1) q2 ON q1.a=q2.a ORDER BY 1;
|
||||||
|
SELECT q1.a, q2.b FROM (SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q1_1) q1 JOIN
|
||||||
|
(SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q2_1) q2 ON q1.a=q2.a ORDER BY 2 desc, 1 asc;
|
||||||
|
|
||||||
# Patch for MCOL-4543 also optimizes out an unnecessary BPS projection in PrimProc
|
# Patch for MCOL-4543 also optimizes out an unnecessary BPS projection in PrimProc
|
||||||
# that was happening earlier. The following 2 queries trigger this optimization.
|
# that was happening earlier. The following 2 queries trigger this optimization.
|
||||||
@ -59,4 +64,4 @@ SELECT COUNT(a) FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t1) q GROUP BY b
|
|||||||
SELECT "123" FROM (SELECT * FROM t1) q GROUP BY b ORDER BY b;
|
SELECT "123" FROM (SELECT * FROM t1) q GROUP BY b ORDER BY b;
|
||||||
SELECT "123" FROM (SELECT * FROM t1) q GROUP BY b;
|
SELECT "123" FROM (SELECT * FROM t1) q GROUP BY b;
|
||||||
|
|
||||||
DROP DATABASE IF EXISTS mcol4543;
|
DROP DATABASE mcol4543;
|
||||||
|
Reference in New Issue
Block a user