diff --git a/executor/table_reader.go b/executor/table_reader.go index de1d317bf3f5d..447e067d9d2df 100644 --- a/executor/table_reader.go +++ b/executor/table_reader.go @@ -227,9 +227,12 @@ func (e *TableReaderExecutor) buildResp(ctx context.Context, ranges []*ranger.Ra factor := e.ctx.GetSessionVars().NetworkFactor totalCost := 0.0 for _, plan := range e.plans { - totalCost += plan.StatsCount()*factor + + totalCost += plan.StatsCount() * factor * plan.Stats().HistColl.GetAvgRowSize(e.ctx, plan.Schema().Columns, false, true) } + + logutil.Eventf(ctx, "table scan %s, total cost: %d", + e.table.Meta().Name.L, totalCost) estimater := func(r *kv.KeyRange, totalRanges []kv.KeyRange) float64 { return totalCost * 1.0 / (float64(len(totalRanges)) + 1.0) } diff --git a/store/tikv/region_request.go b/store/tikv/region_request.go index 71a822c2fca56..b85b9f417c934 100644 --- a/store/tikv/region_request.go +++ b/store/tikv/region_request.go @@ -234,7 +234,7 @@ func (s *RegionRequestSender) getRPCContext( if req.RecommendLocalScan { // We need to avoid the affection of forced replica read type here, so that the // AZ/DC label matching could take effect. - return s.regionCache.GetTiKVRPCContext(bo, regionID, kv.ReplicaReadMixed, seed, WithMatchAZ()) + return s.regionCache.GetTiKVRPCContext(bo, regionID, req.ReplicaReadType, seed, WithMatchAZ()) } else { return s.regionCache.GetTiKVRPCContext(bo, regionID, req.ReplicaReadType, seed) } diff --git a/store/tikv/region_request_test.go b/store/tikv/region_request_test.go index ce2c6e6bbb500..9cdd2348ce79b 100644 --- a/store/tikv/region_request_test.go +++ b/store/tikv/region_request_test.go @@ -111,7 +111,7 @@ func (s *testRegionRequestToThreeStoresSuite) TestGetRPCContext(c *C) { var seed uint32 = 0 var regionID = RegionVerID{s.regionID, 0, 0} - req := tikvrpc.NewReplicaReadRequest(tikvrpc.CmdGet, &kvrpcpb.GetRequest{}, kv.ReplicaReadLeader, &seed) + req := tikvrpc.NewReplicaReadRequest(tikvrpc.CmdGet, &kvrpcpb.GetRequest{}, kv.ReplicaReadLeader, &seed, false) rpcCtx, err := s.regionRequestSender.getRPCContext(s.bo, req, regionID, kv.TiKV) c.Assert(err, IsNil) c.Assert(rpcCtx.Peer.Id, Equals, s.leaderPeer) diff --git a/store/tikv/tikvrpc/tikvrpc.go b/store/tikv/tikvrpc/tikvrpc.go index 887568a9764d0..3713b74e9dea6 100644 --- a/store/tikv/tikvrpc/tikvrpc.go +++ b/store/tikv/tikvrpc/tikvrpc.go @@ -194,10 +194,15 @@ func NewRequest(typ CmdType, pointer interface{}, ctxs ...kvrpcpb.Context) *Requ // NewReplicaReadRequest returns new kv rpc request with replica read. func NewReplicaReadRequest(typ CmdType, pointer interface{}, replicaReadType kv.ReplicaReadType, replicaReadSeed *uint32, recommendLocalScan bool, ctxs ...kvrpcpb.Context) *Request { req := NewRequest(typ, pointer, ctxs...) + if replicaReadType == kv.ReplicaReadLeader && recommendLocalScan { + // We need to avoid the affection of forced replica read type here, so that the + // AZ/DC label matching could take effect. + replicaReadType = kv.ReplicaReadMixed + req.RecommendLocalScan = true + } req.ReplicaRead = replicaReadType.IsFollowerRead() req.ReplicaReadType = replicaReadType req.ReplicaReadSeed = replicaReadSeed - req.RecommendLocalScan = recommendLocalScan return req }