From a7299d3274a014c62d38f52dd172e0c9ae0e210b Mon Sep 17 00:00:00 2001 From: Yuanjia Zhang Date: Tue, 9 May 2023 20:32:08 +0800 Subject: [PATCH] planner: fix wrong task types when calculating cost in some cases (#43637) ref pingcap/tidb#35240 --- .../testdata/enforce_mpp_suite_out.json | 31 ++++++++++--------- planner/core/find_best_task.go | 11 +++++++ planner/core/plan_cost_ver1.go | 3 ++ planner/core/plan_cost_ver2.go | 3 ++ 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/planner/core/casetest/testdata/enforce_mpp_suite_out.json b/planner/core/casetest/testdata/enforce_mpp_suite_out.json index 172d6e5802225..0d2af3674e71b 100644 --- a/planner/core/casetest/testdata/enforce_mpp_suite_out.json +++ b/planner/core/casetest/testdata/enforce_mpp_suite_out.json @@ -51,10 +51,11 @@ { "SQL": "explain format='verbose' select /*+ read_from_storage(tiflash[t]) */ count(*) from t where a=1", "Plan": [ - "StreamAgg_10 1.00 64007.91 root funcs:count(1)->Column#4", - "└─TableReader_24 10.00 63508.91 root data:Selection_23", - " └─Selection_23 10.00 952000.00 cop[tiflash] eq(test.t.a, 1)", - " └─TableFullScan_22 10000.00 928000.00 cop[tiflash] table:t pushed down filter:empty, keep order:false, stats:pseudo" + "StreamAgg_20 1.00 63520.28 root funcs:count(Column#6)->Column#4", + "└─TableReader_21 1.00 63470.38 root data:StreamAgg_9", + " └─StreamAgg_9 1.00 952024.00 batchCop[tiflash] funcs:count(1)->Column#6", + " └─Selection_19 10.00 952000.00 batchCop[tiflash] eq(test.t.a, 1)", + " └─TableFullScan_18 10000.00 928000.00 batchCop[tiflash] table:t pushed down filter:empty, keep order:false, stats:pseudo" ], "Warn": null }, @@ -91,10 +92,11 @@ { "SQL": "explain format='verbose' select /*+ read_from_storage(tiflash[t]) */ count(*) from t where a=1", "Plan": [ - "StreamAgg_12 1.00 64007.91 root funcs:count(1)->Column#4", - "└─TableReader_31 10.00 63508.91 root data:Selection_30", - " └─Selection_30 10.00 952000.00 cop[tiflash] eq(test.t.a, 1)", - " └─TableFullScan_29 10000.00 928000.00 cop[tiflash] table:t pushed down filter:empty, keep order:false, stats:pseudo" + "StreamAgg_27 1.00 63520.28 root funcs:count(Column#7)->Column#4", + "└─TableReader_28 1.00 63470.38 root data:StreamAgg_11", + " └─StreamAgg_11 1.00 952024.00 batchCop[tiflash] funcs:count(1)->Column#7", + " └─Selection_26 10.00 952000.00 batchCop[tiflash] eq(test.t.a, 1)", + " └─TableFullScan_25 10000.00 928000.00 batchCop[tiflash] table:t pushed down filter:empty, keep order:false, stats:pseudo" ], "Warn": null }, @@ -126,10 +128,11 @@ { "SQL": "explain format='verbose' select /*+ read_from_storage(tiflash[t]) */ count(*) from t where a=1", "Plan": [ - "StreamAgg_12 1.00 64007.91 root funcs:count(1)->Column#4", - "└─TableReader_31 10.00 63508.91 root data:Selection_30", - " └─Selection_30 10.00 952000.00 cop[tiflash] eq(test.t.a, 1)", - " └─TableFullScan_29 10000.00 928000.00 cop[tiflash] table:t pushed down filter:empty, keep order:false, stats:pseudo" + "StreamAgg_27 1.00 63520.28 root funcs:count(Column#7)->Column#4", + "└─TableReader_28 1.00 63470.38 root data:StreamAgg_11", + " └─StreamAgg_11 1.00 952024.00 batchCop[tiflash] funcs:count(1)->Column#7", + " └─Selection_26 10.00 952000.00 batchCop[tiflash] eq(test.t.a, 1)", + " └─TableFullScan_25 10000.00 928000.00 batchCop[tiflash] table:t pushed down filter:empty, keep order:false, stats:pseudo" ], "Warn": null }, @@ -165,8 +168,8 @@ "Plan": [ "StreamAgg_27 1.00 49.90 root funcs:count(Column#7)->Column#4", "└─TableReader_28 1.00 0.00 root data:StreamAgg_11", - " └─StreamAgg_11 1.00 1427024.00 batchCop[tiflash] funcs:count(1)->Column#7", - " └─Selection_26 10.00 1427000.00 batchCop[tiflash] eq(test.t.a, 1)", + " └─StreamAgg_11 1.00 952024.00 batchCop[tiflash] funcs:count(1)->Column#7", + " └─Selection_26 10.00 952000.00 batchCop[tiflash] eq(test.t.a, 1)", " └─TableFullScan_25 10000.00 928000.00 batchCop[tiflash] table:t pushed down filter:empty, keep order:false, stats:pseudo" ], "Warn": null diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index 079dc6af3ebc9..b565a42c6822c 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -323,6 +323,17 @@ func getTaskPlanCost(t task, op *physicalOptimizeOp) (float64, bool, error) { taskType = property.RootTaskType case *copTask: // no need to know whether the task is single-read or double-read, so both CopSingleReadTaskType and CopDoubleReadTaskType are OK taskType = property.CopSingleReadTaskType + + // TiFlash can run cop task as well, check whether this cop task will run on TiKV or TiFlash. + if t.(*copTask).tablePlan != nil { + leafNode := t.(*copTask).tablePlan + for len(leafNode.Children()) > 0 { + leafNode = leafNode.Children()[0] + } + if tblScan, isScan := leafNode.(*PhysicalTableScan); isScan && tblScan.StoreType == kv.TiFlash { + taskType = property.MppTaskType + } + } case *mppTask: taskType = property.MppTaskType default: diff --git a/planner/core/plan_cost_ver1.go b/planner/core/plan_cost_ver1.go index ecbdc0e654fb0..8c5300574116b 100644 --- a/planner/core/plan_cost_ver1.go +++ b/planner/core/plan_cost_ver1.go @@ -1270,6 +1270,9 @@ func getOperatorActRows(operator PhysicalPlan) float64 { func getCardinality(operator PhysicalPlan, costFlag uint64) float64 { if hasCostFlag(costFlag, CostFlagUseTrueCardinality) { actualProbeCnt := operator.getActualProbeCnt(operator.SCtx().GetSessionVars().StmtCtx.RuntimeStatsColl) + if actualProbeCnt == 0 { + return 0 + } return getOperatorActRows(operator) / float64(actualProbeCnt) } rows := operator.StatsCount() diff --git a/planner/core/plan_cost_ver2.go b/planner/core/plan_cost_ver2.go index 1f1569e0c14df..14dce649ae672 100644 --- a/planner/core/plan_cost_ver2.go +++ b/planner/core/plan_cost_ver2.go @@ -98,6 +98,9 @@ func (p *PhysicalProjection) getPlanCostVer2(taskType property.TaskType, option inputRows := getCardinality(p.children[0], option.CostFlag) cpuFactor := getTaskCPUFactorVer2(p, taskType) concurrency := float64(p.ctx.GetSessionVars().ProjectionConcurrency()) + if concurrency == 0 { + concurrency = 1 // un-parallel execution + } projCost := filterCostVer2(option, inputRows, p.Exprs, cpuFactor)