From 190990b352b4939c75a60722573ab3f29baa9351 Mon Sep 17 00:00:00 2001 From: lysu Date: Mon, 6 May 2019 13:19:37 +0800 Subject: [PATCH] bindinfo: reduce duplicate DigestHash call (#10352) --- bindinfo/bind_test.go | 16 ++++++++++------ bindinfo/handle.go | 7 +++---- executor/compiler.go | 12 +++++++----- go.mod | 2 +- go.sum | 4 ++-- session/session.go | 9 +++++---- 6 files changed, 28 insertions(+), 22 deletions(-) diff --git a/bindinfo/bind_test.go b/bindinfo/bind_test.go index 3c716fc39354d..d6e1a12a9a5f2 100644 --- a/bindinfo/bind_test.go +++ b/bindinfo/bind_test.go @@ -122,7 +122,8 @@ func (s *testSuite) TestBindParse(c *C) { c.Check(err, IsNil) c.Check(bindHandle.Size(), Equals, 1) - bindData := bindHandle.GetBindRecord("select * from t", "test") + sql, hash := parser.NormalizeDigest("select * from t") + bindData := bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) c.Check(bindData.OriginalSQL, Equals, "select * from t") c.Check(bindData.BindSQL, Equals, "select * from t use index(index_t)") @@ -151,7 +152,9 @@ func (s *testSuite) TestGlobalBinding(c *C) { _, err = tk.Exec("create global binding for select * from t where i>99 using select * from t use index(index_t) where i>99") c.Assert(err, IsNil) - bindData := s.domain.BindHandle().GetBindRecord("select * from t where i > ?", "test") + sql, hash := parser.NormalizeDigest("select * from t where i > ?") + + bindData := s.domain.BindHandle().GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) c.Check(bindData.OriginalSQL, Equals, "select * from t where i > ?") c.Check(bindData.BindSQL, Equals, "select * from t use index(index_t) where i>99") @@ -183,7 +186,7 @@ func (s *testSuite) TestGlobalBinding(c *C) { c.Check(err, IsNil) c.Check(bindHandle.Size(), Equals, 1) - bindData = bindHandle.GetBindRecord("select * from t where i > ?", "test") + bindData = bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) c.Check(bindData.OriginalSQL, Equals, "select * from t where i > ?") c.Check(bindData.BindSQL, Equals, "select * from t use index(index_t) where i>99") @@ -196,7 +199,7 @@ func (s *testSuite) TestGlobalBinding(c *C) { _, err = tk.Exec("DROP global binding for select * from t where i>100") c.Check(err, IsNil) - bindData = s.domain.BindHandle().GetBindRecord("select * from t where i > ?", "test") + bindData = s.domain.BindHandle().GetBindRecord(hash, sql, "test") c.Check(bindData, IsNil) bindHandle = bindinfo.NewBindHandle(tk.Se) @@ -204,7 +207,7 @@ func (s *testSuite) TestGlobalBinding(c *C) { c.Check(err, IsNil) c.Check(bindHandle.Size(), Equals, 0) - bindData = bindHandle.GetBindRecord("select * from t where i > ?", "test") + bindData = bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, IsNil) rs, err = tk.Exec("show global bindings") @@ -400,7 +403,8 @@ func (s *testSuite) TestErrorBind(c *C) { _, err := tk.Exec("create global binding for select * from t where i>100 using select * from t use index(index_t) where i>100") c.Assert(err, IsNil, Commentf("err %v", err)) - bindData := s.domain.BindHandle().GetBindRecord("select * from t where i > ?", "test") + sql, hash := parser.NormalizeDigest("select * from t where i > ?") + bindData := s.domain.BindHandle().GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) c.Check(bindData.OriginalSQL, Equals, "select * from t where i > ?") c.Check(bindData.BindSQL, Equals, "select * from t use index(index_t) where i>100") diff --git a/bindinfo/handle.go b/bindinfo/handle.go index 140b6f8cd8884..2d0712bb5fdb8 100644 --- a/bindinfo/handle.go +++ b/bindinfo/handle.go @@ -284,8 +284,8 @@ func (h *BindHandle) Size() int { } // GetBindRecord return the bindMeta of the (normdOrigSQL,db) if bindMeta exist. -func (h *BindHandle) GetBindRecord(normdOrigSQL, db string) *BindMeta { - return h.bindInfo.Load().(cache).getBindRecord(normdOrigSQL, db) +func (h *BindHandle) GetBindRecord(hash, normdOrigSQL, db string) *BindMeta { + return h.bindInfo.Load().(cache).getBindRecord(hash, normdOrigSQL, db) } // GetAllBindRecord return all bind record in cache. @@ -387,8 +387,7 @@ func copyInvalidBindRecordMap(oldMap map[string]*invalidBindRecordMap) map[strin return newMap } -func (c cache) getBindRecord(normdOrigSQL, db string) *BindMeta { - hash := parser.DigestHash(normdOrigSQL) +func (c cache) getBindRecord(hash, normdOrigSQL, db string) *BindMeta { bindRecords := c[hash] if bindRecords != nil { for _, bindRecord := range bindRecords { diff --git a/executor/compiler.go b/executor/compiler.go index f233bdfe833cd..7f1c85c691011 100644 --- a/executor/compiler.go +++ b/executor/compiler.go @@ -396,17 +396,19 @@ func addHint(ctx sessionctx.Context, stmtNode ast.StmtNode) ast.StmtNode { normalizeExplainSQL := parser.Normalize(x.Text()) idx := strings.Index(normalizeExplainSQL, "select") normalizeSQL := normalizeExplainSQL[idx:] - x.Stmt = addHintForSelect(normalizeSQL, ctx, x.Stmt) + hash := parser.DigestHash(normalizeSQL) + x.Stmt = addHintForSelect(hash, normalizeSQL, ctx, x.Stmt) } return x case *ast.SelectStmt: - return addHintForSelect(parser.Normalize(x.Text()), ctx, x) + normalizeSQL, hash := parser.NormalizeDigest(x.Text()) + return addHintForSelect(hash, normalizeSQL, ctx, x) default: return stmtNode } } -func addHintForSelect(normdOrigSQL string, ctx sessionctx.Context, stmt ast.StmtNode) ast.StmtNode { +func addHintForSelect(hash, normdOrigSQL string, ctx sessionctx.Context, stmt ast.StmtNode) ast.StmtNode { sessionHandle := ctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) bindRecord := sessionHandle.GetBindRecord(normdOrigSQL, ctx.GetSessionVars().CurrentDB) if bindRecord != nil { @@ -418,9 +420,9 @@ func addHintForSelect(normdOrigSQL string, ctx sessionctx.Context, stmt ast.Stmt } } globalHandle := domain.GetDomain(ctx).BindHandle() - bindRecord = globalHandle.GetBindRecord(normdOrigSQL, ctx.GetSessionVars().CurrentDB) + bindRecord = globalHandle.GetBindRecord(hash, normdOrigSQL, ctx.GetSessionVars().CurrentDB) if bindRecord == nil { - bindRecord = globalHandle.GetBindRecord(normdOrigSQL, "") + bindRecord = globalHandle.GetBindRecord(hash, normdOrigSQL, "") } if bindRecord != nil { return bindinfo.BindHint(stmt, bindRecord.Ast) diff --git a/go.mod b/go.mod index 56b76b68b2666..68f788985f536 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e github.com/pingcap/kvproto v0.0.0-20190327032727-3d8cb3a30d5d github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 - github.com/pingcap/parser v0.0.0-20190429120706-c378059f7f42 + github.com/pingcap/parser v0.0.0-20190505092803-4542e963c7f1 github.com/pingcap/pd v0.0.0-20190424024702-bd1e2496a669 github.com/pingcap/tidb-tools v2.1.3-0.20190321065848-1e8b48f5c168+incompatible github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330 diff --git a/go.sum b/go.sum index f2543ff30249b..827c6392873c9 100644 --- a/go.sum +++ b/go.sum @@ -160,8 +160,8 @@ github.com/pingcap/kvproto v0.0.0-20190327032727-3d8cb3a30d5d/go.mod h1:QMdbTAXC github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7/go.mod h1:xsfkWVaFVV5B8e1K9seWfyJWFrIhbtUTAD8NV1Pq3+w= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 h1:t2OQTpPJnrPDGlvA+3FwJptMTt6MEPdzK1Wt99oaefQ= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596/go.mod h1:WpHUKhNZ18v116SvGrmjkA9CBhYmuUTKL+p8JC9ANEw= -github.com/pingcap/parser v0.0.0-20190429120706-c378059f7f42 h1:iuZ/y1DLC/4gLTxw/xtEbo9R2SMRq7CKzLXhffff/kc= -github.com/pingcap/parser v0.0.0-20190429120706-c378059f7f42/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= +github.com/pingcap/parser v0.0.0-20190505092803-4542e963c7f1 h1:YvxFABfyD5Pnp80FUVV4w3zdlmkcwRhQbn7xpTjBwwU= +github.com/pingcap/parser v0.0.0-20190505092803-4542e963c7f1/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= github.com/pingcap/pd v0.0.0-20190424024702-bd1e2496a669 h1:ZoKjndm/Ig7Ru/wojrQkc/YLUttUdQXoH77gtuWCvL4= github.com/pingcap/pd v0.0.0-20190424024702-bd1e2496a669/go.mod h1:MUCxRzOkYiWZtlyi4MhxjCIj9PgQQ/j+BLNGm7aUsnM= github.com/pingcap/tidb-tools v2.1.3-0.20190321065848-1e8b48f5c168+incompatible h1:MkWCxgZpJBgY2f4HtwWMMFzSBb3+JPzeJgF3VrXE/bU= diff --git a/session/session.go b/session/session.go index e25198f8b57e5..5ea7497547262 100644 --- a/session/session.go +++ b/session/session.go @@ -1046,7 +1046,7 @@ func (s *session) execute(ctx context.Context, sql string) (recordSets []sqlexec } func (s *session) handleInvalidBindRecord(ctx context.Context, stmtNode ast.StmtNode) { - var normdOrigSQL string + var normdOrigSQL, hash string switch x := stmtNode.(type) { case *ast.ExplainStmt: switch x.Stmt.(type) { @@ -1054,11 +1054,12 @@ func (s *session) handleInvalidBindRecord(ctx context.Context, stmtNode ast.Stmt normalizeExplainSQL := parser.Normalize(x.Text()) idx := strings.Index(normalizeExplainSQL, "select") normdOrigSQL = normalizeExplainSQL[idx:] + hash = parser.DigestHash(normdOrigSQL) default: return } case *ast.SelectStmt: - normdOrigSQL = parser.Normalize(x.Text()) + normdOrigSQL, hash = parser.NormalizeDigest(x.Text()) default: return } @@ -1070,9 +1071,9 @@ func (s *session) handleInvalidBindRecord(ctx context.Context, stmtNode ast.Stmt } globalHandle := domain.GetDomain(s).BindHandle() - bindMeta = globalHandle.GetBindRecord(normdOrigSQL, s.GetSessionVars().CurrentDB) + bindMeta = globalHandle.GetBindRecord(hash, normdOrigSQL, s.GetSessionVars().CurrentDB) if bindMeta == nil { - bindMeta = globalHandle.GetBindRecord(normdOrigSQL, "") + bindMeta = globalHandle.GetBindRecord(hash, normdOrigSQL, "") } if bindMeta != nil { record := &bindinfo.BindRecord{