Skip to content

Commit

Permalink
Merge pull request pingcap#3 from zhongzc/stmtsummary
Browse files Browse the repository at this point in the history
unify
  • Loading branch information
mornyx committed Jan 31, 2023
2 parents 9bf28ff + a64f1b4 commit fa60ecc
Show file tree
Hide file tree
Showing 7 changed files with 174 additions and 86 deletions.
10 changes: 1 addition & 9 deletions bindinfo/handle.go
Expand Up @@ -41,7 +41,6 @@ import (
"github.com/pingcap/tidb/util/logutil"
utilparser "github.com/pingcap/tidb/util/parser"
"github.com/pingcap/tidb/util/sqlexec"
"github.com/pingcap/tidb/util/stmtsummary"
tablefilter "github.com/pingcap/tidb/util/table-filter"
"github.com/pingcap/tidb/util/timeutil"
"go.uber.org/zap"
Expand Down Expand Up @@ -892,7 +891,7 @@ func (h *BindHandle) CaptureBaselines() {
parser4Capture := parser.New()
captureFilter := h.extractCaptureFilterFromStorage()
emptyCaptureFilter := captureFilter.isEmpty()
bindableStmts := getBindableStmts(h.sctx.GetSessionVars(), captureFilter.frequency)
bindableStmts := h.sctx.GetSessionVars().StmtSummary.GetBindableStmts(captureFilter.frequency)
for _, bindableStmt := range bindableStmts {
stmt, err := parser4Capture.ParseOneStmt(bindableStmt.Query, bindableStmt.Charset, bindableStmt.Collation)
if err != nil {
Expand Down Expand Up @@ -949,13 +948,6 @@ func (h *BindHandle) CaptureBaselines() {
}
}

func getBindableStmts(sessVars *variable.SessionVars, frequency int64) []*stmtsummary.BindableStmt {
if sessVars.EnablePersistentStmtSummary {
return sessVars.StmtSummaryV2.GetMoreThanCntBindableStmt(frequency)
}
return stmtsummary.StmtSummaryByDigestMap.GetMoreThanCntBindableStmt(frequency)
}

func getHintsForSQL(sctx sessionctx.Context, sql string) (string, error) {
origVals := sctx.GetSessionVars().UsePlanBaselines
sctx.GetSessionVars().UsePlanBaselines = false
Expand Down
22 changes: 3 additions & 19 deletions executor/adapter.go
Expand Up @@ -62,7 +62,6 @@ import (
"github.com/pingcap/tidb/util/replayer"
"github.com/pingcap/tidb/util/sqlexec"
"github.com/pingcap/tidb/util/stmtsummary"
stmtsummaryv2 "github.com/pingcap/tidb/util/stmtsummary/v2"
"github.com/pingcap/tidb/util/stringutil"
"github.com/pingcap/tidb/util/topsql"
topsqlstate "github.com/pingcap/tidb/util/topsql/state"
Expand Down Expand Up @@ -1806,19 +1805,8 @@ func (a *ExecStmt) SummaryStmt(succ bool) {
userString = sessVars.User.Username
}

var enabled, enabledInternalQuery bool
if sessVars.EnablePersistentStmtSummary {
if sessVars.StmtSummaryV2 == nil && stmtsummaryv2.GlobalStmtSummary != nil {
sessVars.StmtSummaryV2 = stmtsummaryv2.GlobalStmtSummary
}
if sessVars.StmtSummaryV2 != nil {
enabled = sessVars.StmtSummaryV2.Enabled()
enabledInternalQuery = sessVars.StmtSummaryV2.EnableInternalQuery()
}
} else {
enabled = stmtsummary.StmtSummaryByDigestMap.Enabled()
enabledInternalQuery = stmtsummary.StmtSummaryByDigestMap.EnabledInternal()
}
enabled := sessVars.StmtSummary.Enabled()
enabledInternalQuery := sessVars.StmtSummary.EnabledInternal()
// Internal SQLs must also be recorded to keep the consistency of `PrevStmt` and `PrevStmtDigest`.
if !enabled || ((sessVars.InRestrictedSQL || len(userString) == 0) && !enabledInternalQuery) {
sessVars.SetPrevStmtDigest("")
Expand Down Expand Up @@ -1937,11 +1925,7 @@ func (a *ExecStmt) SummaryStmt(succ bool) {
if a.retryCount > 0 {
stmtExecInfo.ExecRetryTime = costTime - sessVars.DurationParse - sessVars.DurationCompile - time.Since(a.retryStartTime)
}
if sessVars.EnablePersistentStmtSummary {
sessVars.StmtSummaryV2.Add(stmtExecInfo)
} else {
stmtsummary.StmtSummaryByDigestMap.AddStatement(stmtExecInfo)
}
sessVars.StmtSummary.Add(stmtExecInfo)
}

// GetTextToLog return the query text to log.
Expand Down
18 changes: 1 addition & 17 deletions executor/builder.go
Expand Up @@ -1980,26 +1980,10 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo
if v.Extractor != nil {
extractor = v.Extractor.(*plannercore.StatementsSummaryExtractor)
}
if b.ctx.GetSessionVars().EnablePersistentStmtSummary {
return &MemTableReaderExec{
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()),
table: v.Table,
retriever: &stmtSummaryRetrieverV2{
stmtSummary: b.ctx.GetSessionVars().StmtSummaryV2,
table: v.Table,
columns: v.Columns,
extractor: extractor,
},
}
}
return &MemTableReaderExec{
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()),
table: v.Table,
retriever: &stmtSummaryRetriever{
table: v.Table,
columns: v.Columns,
extractor: extractor,
},
retriever: buildStmtSummaryRetriever(b.ctx, v.Table, v.Columns, extractor),
}
case strings.ToLower(infoschema.TableColumns):
return &MemTableReaderExec{
Expand Down
21 changes: 21 additions & 0 deletions executor/stmtsummary.go
Expand Up @@ -29,6 +29,27 @@ import (
stmtsummaryv2 "github.com/pingcap/tidb/util/stmtsummary/v2"
)

func buildStmtSummaryRetriever(
ctx sessionctx.Context,
table *model.TableInfo,
columns []*model.ColumnInfo,
extractor *plannercore.StatementsSummaryExtractor,
) memTableRetriever {
if ctx.GetSessionVars().StmtSummary.EnablePersistent {
return &stmtSummaryRetrieverV2{
stmtSummary: ctx.GetSessionVars().StmtSummary.StmtSummaryV2,
table: table,
columns: columns,
extractor: extractor,
}
}
return &stmtSummaryRetriever{
table: table,
columns: columns,
extractor: extractor,
}
}

// stmtSummaryRetriever is used to retrieve statements summary.
type stmtSummaryRetriever struct {
dummyCloser
Expand Down
138 changes: 130 additions & 8 deletions sessionctx/variable/session.go
Expand Up @@ -54,6 +54,7 @@ import (
"github.com/pingcap/tidb/util/memory"
"github.com/pingcap/tidb/util/replayer"
"github.com/pingcap/tidb/util/rowcodec"
"github.com/pingcap/tidb/util/stmtsummary"
stmtsummaryv2 "github.com/pingcap/tidb/util/stmtsummary/v2"
"github.com/pingcap/tidb/util/stringutil"
"github.com/pingcap/tidb/util/tableutil"
Expand Down Expand Up @@ -1339,12 +1340,8 @@ type SessionVars struct {
// is enabled.
PessimisticTransactionAggressiveLocking bool

// EnablePersistentStmtSummary indicates whether to enable the persistence
// of statements summary in the current session.
EnablePersistentStmtSummary bool
// StmtSummaryV2 refers to the global StmtSummary instance that will be used when
// EnablePersistentStmtSummary is true.
StmtSummaryV2 *stmtsummaryv2.StmtSummary
// StmtSummary collects statements summary for the current session.
StmtSummary *stmtSummary
}

// planReplayerSessionFinishedTaskKeyLen is used to control the max size for the finished plan replayer task key in session
Expand Down Expand Up @@ -1719,8 +1716,7 @@ func NewSessionVars(hctx HookContext) *SessionVars {
EnableReuseCheck: DefTiDBEnableReusechunk,
preUseChunkAlloc: DefTiDBUseAlloc,
ChunkPool: ReuseChunkPool{Alloc: nil},
EnablePersistentStmtSummary: config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent,
StmtSummaryV2: stmtsummaryv2.GlobalStmtSummary,
StmtSummary: newStmtSummary(),
}
vars.KVVars = tikvstore.NewVariables(&vars.Killed)
vars.Concurrency = Concurrency{
Expand Down Expand Up @@ -3256,3 +3252,129 @@ func (lst *protectedTSList) Size() (size int) {
lst.Unlock()
return
}

// stmtSummary is an adapter to redirect executions to instances of different types of statement summary.
type stmtSummary struct {
// EnablePersistent indicates whether to enable the persistence
// of statements summary in the current session.
EnablePersistent bool
// StmtSummaryV2 refers to the global StmtSummary instance that will be used when
// EnablePersistent is true.
StmtSummaryV2 *stmtsummaryv2.StmtSummary
}

func newStmtSummary() *stmtSummary {
return &stmtSummary{
EnablePersistent: config.GetGlobalConfig().Instance.StmtSummaryEnablePersistent,
StmtSummaryV2: stmtsummaryv2.GlobalStmtSummary,
}
}

func (s *stmtSummary) Add(stmtExecInfo *stmtsummary.StmtExecInfo) {
s.tryInit()

if s.EnablePersistent && s.StmtSummaryV2 != nil {
s.StmtSummaryV2.Add(stmtExecInfo)
} else if !s.EnablePersistent {
stmtsummary.StmtSummaryByDigestMap.AddStatement(stmtExecInfo)
}
}

func (s *stmtSummary) Enabled() bool {
s.tryInit()

if s.EnablePersistent && s.StmtSummaryV2 != nil {
return s.StmtSummaryV2.Enabled()
} else if !s.EnablePersistent {
return stmtsummary.StmtSummaryByDigestMap.Enabled()
}

return false
}

func (s *stmtSummary) EnabledInternal() bool {
s.tryInit()

if s.EnablePersistent && s.StmtSummaryV2 != nil {
return s.StmtSummaryV2.EnableInternalQuery()
} else if !s.EnablePersistent {
return stmtsummary.StmtSummaryByDigestMap.EnabledInternal()
}

return false
}

func (s *stmtSummary) GetBindableStmts(frequency int64) []*stmtsummary.BindableStmt {
s.tryInit()

if s.EnablePersistent && s.StmtSummaryV2 != nil {
return s.StmtSummaryV2.GetMoreThanCntBindableStmt(frequency)
} else if !s.EnablePersistent {
return stmtsummary.StmtSummaryByDigestMap.GetMoreThanCntBindableStmt(frequency)
}

return nil
}

func (s *stmtSummary) SetEnabled(v bool) {
s.tryInit()

if s.EnablePersistent && s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetEnabled(v)
} else if !s.EnablePersistent {
stmtsummary.StmtSummaryByDigestMap.SetEnabled(v)
}
}

func (s *stmtSummary) SetEnableInternalQuery(v bool) {
s.tryInit()

if s.EnablePersistent && s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetEnableInternalQuery(v)
} else if !s.EnablePersistent {
stmtsummary.StmtSummaryByDigestMap.SetEnabledInternalQuery(v)
}
}

func (s *stmtSummary) SetRefreshInterval(v int64) {
s.tryInit()

if s.EnablePersistent && s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetRefreshInterval(uint32(v))
} else if !s.EnablePersistent {
stmtsummary.StmtSummaryByDigestMap.SetRefreshInterval(v)
}
}

func (s *stmtSummary) SetHistorySize(v int) {
if !s.EnablePersistent {
stmtsummary.StmtSummaryByDigestMap.SetHistorySize(v)
}
}

func (s *stmtSummary) SetMaxStmtCount(v int) {
s.tryInit()

if s.EnablePersistent && s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetMaxStmtCount(uint32(v))
} else if !s.EnablePersistent {
stmtsummary.StmtSummaryByDigestMap.SetMaxStmtCount(uint(v))
}
}

func (s *stmtSummary) SetMaxSQLLength(v int) {
s.tryInit()

if s.EnablePersistent && s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetMaxSQLLength(uint32(v))
} else if !s.EnablePersistent {
stmtsummary.StmtSummaryByDigestMap.SetMaxSQLLength(v)
}
}

// tryInit initials StmtSummaryV2 in case it is nil.
func (s *stmtSummary) tryInit() {
if s.EnablePersistent && s.StmtSummaryV2 == nil {
s.StmtSummaryV2 = stmtsummaryv2.GlobalStmtSummary
}
}
39 changes: 12 additions & 27 deletions sessionctx/variable/sysvar.go
Expand Up @@ -40,7 +40,6 @@ import (
"github.com/pingcap/tidb/util/logutil"
"github.com/pingcap/tidb/util/mathutil"
"github.com/pingcap/tidb/util/memory"
"github.com/pingcap/tidb/util/stmtsummary"
"github.com/pingcap/tidb/util/tikvutil"
"github.com/pingcap/tidb/util/tls"
topsqlstate "github.com/pingcap/tidb/util/topsql/state"
Expand Down Expand Up @@ -667,48 +666,34 @@ var defaultSysVars = []*SysVar{
{Scope: ScopeGlobal, Name: TiDBScatterRegion, Value: BoolToOnOff(DefTiDBScatterRegion), Type: TypeBool},
{Scope: ScopeGlobal, Name: TiDBEnableStmtSummary, Value: BoolToOnOff(DefTiDBEnableStmtSummary), Type: TypeBool, AllowEmpty: true,
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
v := TiDBOptOn(val)
if s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetEnabled(v)
}
return stmtsummary.StmtSummaryByDigestMap.SetEnabled(v)
s.StmtSummary.SetEnabled(TiDBOptOn(val))
return nil
}},
{Scope: ScopeGlobal, Name: TiDBStmtSummaryInternalQuery, Value: BoolToOnOff(DefTiDBStmtSummaryInternalQuery), Type: TypeBool, AllowEmpty: true,
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
v := TiDBOptOn(val)
if s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetEnableInternalQuery(v)
}
return stmtsummary.StmtSummaryByDigestMap.SetEnabledInternalQuery(v)
s.StmtSummary.SetEnableInternalQuery(TiDBOptOn(val))
return nil
}},
{Scope: ScopeGlobal, Name: TiDBStmtSummaryRefreshInterval, Value: strconv.Itoa(DefTiDBStmtSummaryRefreshInterval), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt32, AllowEmpty: true,
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
// convert val to int64
v := TidbOptInt64(val, DefTiDBStmtSummaryRefreshInterval)
if s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetRefreshInterval(uint32(v))
}
return stmtsummary.StmtSummaryByDigestMap.SetRefreshInterval(v)
s.StmtSummary.SetRefreshInterval(TidbOptInt64(val, DefTiDBStmtSummaryRefreshInterval))
return nil
}},
{Scope: ScopeGlobal, Name: TiDBStmtSummaryHistorySize, Value: strconv.Itoa(DefTiDBStmtSummaryHistorySize), Type: TypeInt, MinValue: 0, MaxValue: math.MaxUint8, AllowEmpty: true,
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
return stmtsummary.StmtSummaryByDigestMap.SetHistorySize(TidbOptInt(val, DefTiDBStmtSummaryHistorySize))
s.StmtSummary.SetHistorySize(TidbOptInt(val, DefTiDBStmtSummaryHistorySize))
return nil
}},
{Scope: ScopeGlobal, Name: TiDBStmtSummaryMaxStmtCount, Value: strconv.Itoa(DefTiDBStmtSummaryMaxStmtCount), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt16, AllowEmpty: true,
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
v := TidbOptInt(val, DefTiDBStmtSummaryMaxStmtCount)
if s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetMaxStmtCount(uint32(v))
}
return stmtsummary.StmtSummaryByDigestMap.SetMaxStmtCount(uint(v))
s.StmtSummary.SetMaxStmtCount(TidbOptInt(val, DefTiDBStmtSummaryMaxStmtCount))
return nil
}},
{Scope: ScopeGlobal, Name: TiDBStmtSummaryMaxSQLLength, Value: strconv.Itoa(DefTiDBStmtSummaryMaxSQLLength), Type: TypeInt, MinValue: 0, MaxValue: math.MaxInt32, AllowEmpty: true,
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
v := TidbOptInt(val, DefTiDBStmtSummaryMaxSQLLength)
if s.StmtSummaryV2 != nil {
s.StmtSummaryV2.SetMaxSQLLength(uint32(v))
}
return stmtsummary.StmtSummaryByDigestMap.SetMaxSQLLength(v)
s.StmtSummary.SetMaxSQLLength(TidbOptInt(val, DefTiDBStmtSummaryMaxSQLLength))
return nil
}},
{Scope: ScopeGlobal, Name: TiDBCapturePlanBaseline, Value: DefTiDBCapturePlanBaseline, Type: TypeBool, AllowEmptyAll: true},
{Scope: ScopeGlobal, Name: TiDBEvolvePlanTaskMaxTime, Value: strconv.Itoa(DefTiDBEvolvePlanTaskMaxTime), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64},
Expand Down
12 changes: 6 additions & 6 deletions util/stmtsummary/v2/tests/table_test.go
Expand Up @@ -465,8 +465,8 @@ func TestPerformanceSchemaforPlanCache(t *testing.T) {

func newTestKit(t *testing.T, store kv.Storage, stmtSummary *stmtsummaryv2.StmtSummary) *testkit.TestKit {
tk := testkit.NewTestKit(t, store)
tk.Session().GetSessionVars().EnablePersistentStmtSummary = true
tk.Session().GetSessionVars().StmtSummaryV2 = stmtSummary
tk.Session().GetSessionVars().StmtSummary.EnablePersistent = true
tk.Session().GetSessionVars().StmtSummary.StmtSummaryV2 = stmtSummary
tk.MustExec("use test")
return tk
}
Expand All @@ -483,8 +483,8 @@ func newTestKitWithPlanCache(t *testing.T, store kv.Storage, stmtSummary *stmtsu
PreparedPlanCache: plannercore.NewLRUPlanCache(100, 0.1, math.MaxUint64, tk.Session()),
})
require.NoError(t, err)
se.GetSessionVars().EnablePersistentStmtSummary = true
se.GetSessionVars().StmtSummaryV2 = stmtSummary
tk.Session().GetSessionVars().StmtSummary.EnablePersistent = true
tk.Session().GetSessionVars().StmtSummary.StmtSummaryV2 = stmtSummary
tk.SetSession(se)
tk.RefreshConnectionID()
require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil))
Expand All @@ -496,7 +496,7 @@ func enableStmtSummaryV2InBindHandle(t *testing.T, store kv.Storage, stmtSummary
require.NoError(t, err)
ss, err := session.CreateSession4Test(store)
require.NoError(t, err)
ss.GetSessionVars().EnablePersistentStmtSummary = true
ss.GetSessionVars().StmtSummaryV2 = stmtSummary
tk.Session().GetSessionVars().StmtSummary.EnablePersistent = true
tk.Session().GetSessionVars().StmtSummary.StmtSummaryV2 = stmtSummary
dom.BindHandle().Reset(ss)
}

0 comments on commit fa60ecc

Please sign in to comment.