Files
tidb/pkg/ddl/bench_test.go

107 lines
3.5 KiB
Go

// Copyright 2023 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ddl_test
import (
"context"
"testing"
"github.com/pingcap/tidb/pkg/ddl"
"github.com/pingcap/tidb/pkg/ddl/copr"
"github.com/pingcap/tidb/pkg/kv"
"github.com/pingcap/tidb/pkg/meta/model"
"github.com/pingcap/tidb/pkg/parser/ast"
"github.com/pingcap/tidb/pkg/table"
"github.com/pingcap/tidb/pkg/table/tables"
"github.com/pingcap/tidb/pkg/testkit"
"github.com/pingcap/tidb/pkg/types"
"github.com/pingcap/tidb/pkg/util/chunk"
"github.com/stretchr/testify/require"
)
func BenchmarkExtractDatumByOffsets(b *testing.B) {
store, dom := testkit.CreateMockStoreAndDomain(b)
tk := testkit.NewTestKit(b, store)
tk.MustExec("use test")
tk.MustExec("drop table if exists t;")
tk.MustExec("create table t (a bigint, b int, index idx (b));")
for i := range 8 {
tk.MustExec("insert into t values (?, ?)", i, i)
}
tbl, err := dom.InfoSchema().TableByName(context.Background(), ast.NewCIStr("test"), ast.NewCIStr("t"))
require.NoError(b, err)
tblInfo := tbl.Meta()
idxInfo := tblInfo.FindIndexByName("idx")
sctx := tk.Session()
copCtx, err := ddl.NewReorgCopContext(ddl.NewDDLReorgMeta(sctx), tblInfo, []*model.IndexInfo{idxInfo}, "")
require.NoError(b, err)
require.IsType(b, copCtx, &copr.CopContextSingleIndex{})
require.NoError(b, err)
startKey := tbl.RecordPrefix()
endKey := startKey.PrefixNext()
txn, err := store.Begin()
require.NoError(b, err)
copChunk, err := FetchChunk4Test(copCtx, tbl.(table.PhysicalTable), startKey, endKey, store, 10)
require.NoError(b, err)
require.NoError(b, txn.Rollback())
handleDataBuf := make([]types.Datum, len(copCtx.GetBase().HandleOutputOffsets))
iter := chunk.NewIterator4Chunk(copChunk)
row := iter.Begin()
c := copCtx.GetBase()
offsets := copCtx.IndexColumnOutputOffsets(idxInfo.ID)
b.ResetTimer()
for i := 0; i < b.N; i++ {
ddl.ExtractDatumByOffsets(tk.Session().GetExprCtx().GetEvalCtx(), row, offsets, c.ExprColumnInfos, handleDataBuf)
}
}
func BenchmarkGenerateIndexKV(b *testing.B) {
store, dom := testkit.CreateMockStoreAndDomain(b)
tk := testkit.NewTestKit(b, store)
tk.MustExec("use test")
tk.MustExec("drop table if exists t;")
tk.MustExec("create table t (a bigint, b int, index idx (b));")
for i := range 8 {
tk.MustExec("insert into t values (?, ?)", i, i)
}
tbl, err := dom.InfoSchema().TableByName(context.Background(), ast.NewCIStr("test"), ast.NewCIStr("t"))
require.NoError(b, err)
tblInfo := tbl.Meta()
idxInfo := tblInfo.FindIndexByName("idx")
index, err := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo)
require.NoError(b, err)
sctx := tk.Session().GetSessionVars().StmtCtx
idxDt := []types.Datum{types.NewIntDatum(10)}
buf := make([]byte, 0, 64)
handle := kv.IntHandle(1)
b.ResetTimer()
for i := 0; i < b.N; i++ {
buf = buf[:0]
iter := index.GenIndexKVIter(sctx.ErrCtx(), sctx.TimeZone(), idxDt, handle, nil)
_, _, _, err = iter.Next(buf, nil)
if err != nil {
break
}
}
require.NoError(b, err)
}