Skip to content

Commit

Permalink
*: optimize query statements summary table by avoid decode plan for e…
Browse files Browse the repository at this point in the history
…ach row (#25892)
  • Loading branch information
crazycs520 authored Jul 6, 2021
1 parent f8522c7 commit a8d23fd
Show file tree
Hide file tree
Showing 14 changed files with 901 additions and 383 deletions.
16 changes: 12 additions & 4 deletions executor/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -1572,11 +1572,7 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo
strings.ToLower(infoschema.TableTiFlashReplica),
strings.ToLower(infoschema.TableTiDBServersInfo),
strings.ToLower(infoschema.TableTiKVStoreStatus),
strings.ToLower(infoschema.TableStatementsSummary),
strings.ToLower(infoschema.TableStatementsSummaryHistory),
strings.ToLower(infoschema.TableStatementsSummaryEvicted),
strings.ToLower(infoschema.ClusterTableStatementsSummary),
strings.ToLower(infoschema.ClusterTableStatementsSummaryHistory),
strings.ToLower(infoschema.ClusterTableStatementsSummaryEvicted),
strings.ToLower(infoschema.TablePlacementPolicy),
strings.ToLower(infoschema.TableClientErrorsSummaryGlobal),
Expand All @@ -1595,6 +1591,18 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo
columns: v.Columns,
},
}
case strings.ToLower(infoschema.TableStatementsSummary),
strings.ToLower(infoschema.TableStatementsSummaryHistory),
strings.ToLower(infoschema.ClusterTableStatementsSummaryHistory),
strings.ToLower(infoschema.ClusterTableStatementsSummary):
return &MemTableReaderExec{
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()),
table: v.Table,
retriever: &stmtSummaryTableRetriever{
table: v.Table,
columns: v.Columns,
},
}
case strings.ToLower(infoschema.TableColumns):
return &MemTableReaderExec{
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()),
Expand Down
79 changes: 52 additions & 27 deletions executor/infoschema_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,13 +143,9 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex
e.dataForTableTiFlashReplica(sctx, dbs)
case infoschema.TableTiKVStoreStatus:
err = e.dataForTiKVStoreStatus(sctx)
case infoschema.TableStatementsSummary,
infoschema.TableStatementsSummaryHistory,
infoschema.TableStatementsSummaryEvicted,
infoschema.ClusterTableStatementsSummary,
infoschema.ClusterTableStatementsSummaryHistory,
case infoschema.TableStatementsSummaryEvicted,
infoschema.ClusterTableStatementsSummaryEvicted:
err = e.setDataForStatementsSummary(sctx, e.table.Name.O)
err = e.setDataForStatementsSummaryEvicted(sctx)
case infoschema.TablePlacementPolicy:
err = e.setDataForPlacementPolicy(sctx)
case infoschema.TableClientErrorsSummaryGlobal,
Expand Down Expand Up @@ -1907,27 +1903,10 @@ func (e *memtableRetriever) dataForTableTiFlashReplica(ctx sessionctx.Context, s
e.rows = rows
}

func (e *memtableRetriever) setDataForStatementsSummary(ctx sessionctx.Context, tableName string) error {
user := ctx.GetSessionVars().User
isSuper := false
if pm := privilege.GetPrivilegeManager(ctx); pm != nil {
isSuper = pm.RequestVerificationWithUser("", "", "", mysql.SuperPriv, user)
}
switch tableName {
case infoschema.TableStatementsSummary,
infoschema.ClusterTableStatementsSummary:
e.rows = stmtsummary.StmtSummaryByDigestMap.ToCurrentDatum(user, isSuper)
case infoschema.TableStatementsSummaryHistory,
infoschema.ClusterTableStatementsSummaryHistory:
e.rows = stmtsummary.StmtSummaryByDigestMap.ToHistoryDatum(user, isSuper)
case infoschema.TableStatementsSummaryEvicted,
infoschema.ClusterTableStatementsSummaryEvicted:
e.rows = stmtsummary.StmtSummaryByDigestMap.ToEvictedCountDatum()
}
switch tableName {
case infoschema.ClusterTableStatementsSummary,
infoschema.ClusterTableStatementsSummaryHistory,
infoschema.ClusterTableStatementsSummaryEvicted:
func (e *memtableRetriever) setDataForStatementsSummaryEvicted(ctx sessionctx.Context) error {
e.rows = stmtsummary.StmtSummaryByDigestMap.ToEvictedCountDatum()
switch e.table.Name.O {
case infoschema.ClusterTableStatementsSummaryEvicted:
rows, err := infoschema.AppendHostInfoToRows(ctx, e.rows)
if err != nil {
return err
Expand Down Expand Up @@ -2113,6 +2092,49 @@ func (e *memtableRetriever) setDataForClusterDeadlock(ctx sessionctx.Context) er
return nil
}

type stmtSummaryTableRetriever struct {
dummyCloser
table *model.TableInfo
columns []*model.ColumnInfo
retrieved bool
}

// retrieve implements the infoschemaRetriever interface
func (e *stmtSummaryTableRetriever) retrieve(ctx context.Context, sctx sessionctx.Context) ([][]types.Datum, error) {
if e.retrieved {
return nil, nil
}
e.retrieved = true
user := sctx.GetSessionVars().User
isSuper := false
if pm := privilege.GetPrivilegeManager(sctx); pm != nil {
isSuper = pm.RequestVerificationWithUser("", "", "", mysql.SuperPriv, user)
}

var err error
var instanceAddr string
switch e.table.Name.O {
case infoschema.ClusterTableStatementsSummary,
infoschema.ClusterTableStatementsSummaryHistory:
instanceAddr, err = infoschema.GetInstanceAddr(sctx)
if err != nil {
return nil, err
}
}
reader := stmtsummary.NewStmtSummaryReader(user, isSuper, e.columns, instanceAddr)
var rows [][]types.Datum
switch e.table.Name.O {
case infoschema.TableStatementsSummary,
infoschema.ClusterTableStatementsSummary:
rows = reader.GetStmtSummaryCurrentRows()
case infoschema.TableStatementsSummaryHistory,
infoschema.ClusterTableStatementsSummaryHistory:
rows = reader.GetStmtSummaryHistoryRows()
}

return rows, nil
}

type hugeMemTableRetriever struct {
dummyCloser
table *model.TableInfo
Expand Down Expand Up @@ -2154,6 +2176,9 @@ func (e *hugeMemTableRetriever) retrieve(ctx context.Context, sctx sessionctx.Co
}

func adjustColumns(input [][]types.Datum, outColumns []*model.ColumnInfo, table *model.TableInfo) [][]types.Datum {
if table.Name.O == infoschema.TableStatementsSummary {
return input
}
if len(outColumns) == len(table.Columns) {
return input
}
Expand Down
27 changes: 18 additions & 9 deletions infoschema/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ var memTableToClusterTables = map[string]string{
}

func init() {
var addrCol = columnInfo{name: "INSTANCE", tp: mysql.TypeVarchar, size: 64}
var addrCol = columnInfo{name: util.ClusterTableInstanceColumnName, tp: mysql.TypeVarchar, size: 64}
for memTableName, clusterMemTableName := range memTableToClusterTables {
memTableCols := tableNameToColumns[memTableName]
if len(memTableCols) == 0 {
Expand Down Expand Up @@ -91,17 +91,10 @@ func isClusterTableByName(dbName, tableName string) bool {

// AppendHostInfoToRows appends host info to the rows.
func AppendHostInfoToRows(ctx sessionctx.Context, rows [][]types.Datum) ([][]types.Datum, error) {
serverInfo, err := infosync.GetServerInfo()
addr, err := GetInstanceAddr(ctx)
if err != nil {
return nil, err
}
addr := serverInfo.IP + ":" + strconv.FormatUint(uint64(serverInfo.StatusPort), 10)
if sem.IsEnabled() {
checker := privilege.GetPrivilegeManager(ctx)
if checker == nil || !checker.RequestDynamicVerification(ctx.GetSessionVars().ActiveRoles, "RESTRICTED_TABLES_ADMIN", false) {
addr = serverInfo.ID
}
}
for i := range rows {
row := make([]types.Datum, 0, len(rows[i])+1)
row = append(row, types.NewStringDatum(addr))
Expand All @@ -110,3 +103,19 @@ func AppendHostInfoToRows(ctx sessionctx.Context, rows [][]types.Datum) ([][]typ
}
return rows, nil
}

// GetInstanceAddr gets the instance address.
func GetInstanceAddr(ctx sessionctx.Context) (string, error) {
serverInfo, err := infosync.GetServerInfo()
if err != nil {
return "", err
}
addr := serverInfo.IP + ":" + strconv.FormatUint(uint64(serverInfo.StatusPort), 10)
if sem.IsEnabled() {
checker := privilege.GetPrivilegeManager(ctx)
if checker == nil || !checker.RequestDynamicVerification(ctx.GetSessionVars().ActiveRoles, "RESTRICTED_TABLES_ADMIN", false) {
addr = serverInfo.ID
}
}
return addr, nil
}
Loading

0 comments on commit a8d23fd

Please sign in to comment.