1.3 SQL Plan Management

    SQL Bind 是 SQL Plan Management 的第一步,在 TiDB 3.0 版本中 GA。使用它,用户可以为某一类型的 SQL 绑定执行计划。当出现执行计划不优时,可以使用 SQL Bind 在不更改业务的情况下快速地对执行计划进行修复。

    创建绑定可以使用如下的 SQL:

    该语句可以在 GLOBAL 或者 SESSION 作用域内为 SQL 绑定执行计划。在不指定作用域时,默认作用域为 SESSION。被绑定的 SQL 会被参数化,然后存储到系统表中。在处理 SQL 查询时,只要参数化后的 SQL 和系统表中某个被绑定的 SQL 匹配即可使用相应的优化器 Hint。

    创建一个绑定的例子:

    查看刚才创建的 binding,下面输出结果中 Original_sql 即为参数化后的 SQL:

    如果要删除创建的 binding 可通过如下语句:

    1. TiDB(root@127.0.0.1:test) > drop binding for select * from t where a = 1;
    2. Query OK, 0 rows affected (0.00 sec)

    接着连续跑两遍如下查询即可自动为其创建一条绑定:

    1. TiDB(root@127.0.0.1:test) > select * from t;
    2. Empty set (0.01 sec)
    3. TiDB(root@127.0.0.1:test) > select * from t;

    再查看 global bindings 即可发现自动创建的 binding:

    随着数据的变更,或者表结构定义的变化,可能原先绑定的执行计划已经不是最优的了,在 4.0 版本中可以通过 set global tidb_evolve_plan_baselines = 1 开启自动演进功能,来适应新的变化。对于自动演进来说,需要解决两个主要问题:一个是演进哪些 SQL,一个是如何演进 SQL。

    对于第二个问题,关键点在于如何确定新生成的执行计划是比之前更好。最可靠的办法便是真实地执行一遍,并将其与优化器在多个绑定中选出的最优执行计划进行对比,只有当待验证的比已经被绑定的执行计划要好一定程度,才将其标记为可用。当然,实际执行带来的问题便是对系统集群的影响。为了减少自动演进对集群的影响,可以通过 tidb_evolve_plan_task_max_time 来限制每个执行计划运行的最长时间,其默认值为十分钟;通过 tidb_evolve_plan_task_start_time 和 可以限制运行演进任务的时间窗口,默认的时间窗口为全天。