diff --git a/pkg/session/bench_test.go b/pkg/session/bench_test.go index 2bc1e186996e9..8e0826572f5aa 100644 --- a/pkg/session/bench_test.go +++ b/pkg/session/bench_test.go @@ -2111,3 +2111,37 @@ func BenchmarkPipelinedReplaceNoDuplicates(b *testing.B) { b.StopTimer() b.ReportMetric(float64(b.Elapsed().Nanoseconds()/int64(b.N*batchSize*batchNum)), "ns/row") } + +func BenchmarkPipelinedUpdate(b *testing.B) { + failpoint.Enable("tikvclient/pipelinedSkipResolveLock", "return") + defer failpoint.Disable("tikvclient/pipelinedSkipResolveLock") + logutil.InitLogger(&logutil.LogConfig{Config: log.Config{Level: "fatal"}}) + se, do, st := prepareBenchSession() + defer func() { + se.Close() + do.Close() + st.Close() + }() + mustExecute(se, `create table tmp (id int, dt varchar(512))`) + mustExecute(se, `create table src (id int, dt varchar(512))`) + for i := 0; i < batchNum; i++ { + mustExecute(se, "begin") + for lines := 0; lines < batchSize; lines++ { + mustExecute(se, "insert into src values (42, repeat('x', 512))") + } + mustExecute(se, "commit") + } + + se.GetSessionVars().BulkDMLEnabled = true + se.GetSessionVars().StmtCtx.InUpdateStmt = true + + b.ResetTimer() + for i := 0; i < b.N; i++ { + mustExecute(se, "truncate tmp") + mustExecute(se, "insert into tmp select * from src") + b.StartTimer() + se.Execute(context.Background(), "update tmp set dt = concat(dt, 'updated')") + b.StopTimer() + } + b.ReportMetric(float64(b.Elapsed().Nanoseconds()/int64(b.N*batchSize*batchNum)), "ns/row") +} \ No newline at end of file