diff --git a/go/libraries/doltcore/doltdb/table.go b/go/libraries/doltcore/doltdb/table.go index 9fda2989c5e..bfcf898f4f7 100644 --- a/go/libraries/doltcore/doltdb/table.go +++ b/go/libraries/doltcore/doltdb/table.go @@ -57,6 +57,7 @@ func IsValidIdentifier(name string) bool { // Table is a struct which holds row data, as well as a reference to its schema. type Table struct { table durable.Table + tableData durable.Index overriddenSchema schema.Schema } @@ -442,7 +443,14 @@ func (t *Table) GetNomsRowData(ctx context.Context) (types.Map, error) { // GetRowData retrieves the underlying map which is a map from a primary key to a list of field values. func (t *Table) GetRowData(ctx context.Context) (durable.Index, error) { - return t.table.GetTableRows(ctx) + if t.tableData == nil { + var err error + t.tableData, err = t.table.GetTableRows(ctx) + if err != nil { + return nil, err + } + } + return t.tableData, nil } func (t *Table) GetRowDataWithDescriptors(ctx context.Context, kd, vd val.TupleDesc) (durable.Index, error) { diff --git a/go/libraries/doltcore/sqle/tables.go b/go/libraries/doltcore/sqle/tables.go index 50f3b2aa498..3fc361a6639 100644 --- a/go/libraries/doltcore/sqle/tables.go +++ b/go/libraries/doltcore/sqle/tables.go @@ -85,6 +85,8 @@ var _ dtables.VersionableTable = (*DoltTable)(nil) type DoltTable struct { db dsess.SqlDatabase lockedToRoot doltdb.RootValue + cachedRoot doltdb.RootValue + cachedTable *doltdb.Table // overriddenSchema is set when the @@dolt_override_schema system var is in use overriddenSchema schema.Schema @@ -315,19 +317,22 @@ func (t *DoltTable) DoltTable(ctx *sql.Context) (*doltdb.Table, error) { return nil, err } - table, ok, err := root.GetTable(ctx, t.TableName()) - if err != nil { - return nil, err - } - if !ok { - return nil, sql.ErrTableNotFound.New(t.tableName) - } - - if t.overriddenSchema != nil { - table.OverrideSchema(t.overriddenSchema) + if root != t.cachedRoot { + table, ok, err := root.GetTable(ctx, t.TableName()) + if err != nil { + return nil, err + } + if !ok { + return nil, sql.ErrTableNotFound.New(t.tableName) + } + if t.overriddenSchema != nil { + table.OverrideSchema(t.overriddenSchema) + } + t.cachedRoot = root + t.cachedTable = table } - return table, nil + return t.cachedTable, nil } // DataCacheKey returns an opaque key that can be compared for equality to see if this diff --git a/go/performance/microsysbench/sysbench_test.go b/go/performance/microsysbench/sysbench_test.go index 1d2a39c9681..ac630184ab6 100644 --- a/go/performance/microsysbench/sysbench_test.go +++ b/go/performance/microsysbench/sysbench_test.go @@ -25,7 +25,6 @@ import ( "sync" "testing" - "github.com/dolthub/go-mysql-server/server" "github.com/dolthub/go-mysql-server/sql" "github.com/stretchr/testify/require" @@ -124,21 +123,23 @@ func benchmarkSysbenchQuery(b *testing.B, getQuery func(int) string) { }) ctx, eng := setupBenchmark(b, dEnv) for i := 0; i < b.N; i++ { - schema, iter, _, err := eng.Query(ctx, getQuery(i)) + _, iter, _, err := eng.Query(ctx, getQuery(i)) require.NoError(b, err) - i := 0 - buf := sql.NewByteBuffer(16000) + //schema, iter, _, err := eng.Query(ctx, getQuery(i)) + //i := 0 + //buf := sql.NewByteBuffer(16000) for { - i++ - row, err := iter.Next(ctx) + //i++ + //row, err := iter.Next(ctx) + _, err = iter.Next(ctx) if err != nil { break } - outputRow, err := server.RowToSQL(ctx, schema, row, nil, buf) - _ = outputRow - if i%128 == 0 { - buf.Reset() - } + //outputRow, err := server.RowToSQL(ctx, schema, row, nil, buf) + //_ = outputRow + //if i%128 == 0 { + // buf.Reset() + //} } require.Error(b, io.EOF) err = iter.Close(ctx)