本文介绍如何在 OceanBase 数据库中使用 Outline 绑定执行计划并验证绑定的执行计划生效。
使用 SQL_ID 创建 Outline
创建测试表 t1。
obclient [TEST0113]> CREATE TABLE t1(c1 int,c2 int,c3 int); Query OK, 0 rows affected (1.463 sec)插入测试数据。
obclient [TEST0113]> INSERT INTO t1 VALUES(1,1,1),(2,2,2),(3,3,3); Query OK, 3 rows affected (0.020 sec) Records: 3 Duplicates: 0 Warnings: 0提交插入数据。
obclient [TEST0113]> SELECT COUNT(*) FROM t1;输出结果如下:
+----------+ | COUNT(*) | +----------+ | 3 | +----------+ 1 row in set (0.056 sec)查询全局 SQL 审计表
GV$OB_SQL_AUDIT获取实际的 SQL 语句的 SQL_ID。(V2.x 和 V3.x 版本中视图为GV$SQL_AUDIT)obclient [TEST0113]> SELECT SQL_ID FROM GV$OB_SQL_AUDIT WHERE QUERY_SQL LIKE '%SELECT COUNT(*) FROM t1%';输出结果如下:
+----------------------------------+ | SQL_ID | +----------------------------------+ | 69AE2D9E3BF106CE009F93EFAF925EC8 | +----------------------------------+ 1 row in set (0.084 sec)通过 SQL_ID 查询计划缓存视图
GV$OB_PLAN_CACHE_PLAN_STAT获取 OUTLINE 相关信息。(V2.x 和 V3.x 版本中视图为GV$PLAN_CACHE_PLAN_STAT)obclient [TEST0113> SELECT SQL_ID,PLAN_ID,QUERY_SQL,OUTLINE_ID,OUTLINE_DATA FROM GV$OB_PLAN_CACHE_PLAN_STAT WHERE SQL_ID='69AE2D9E3BF106CE009F93EFAF925EC8';输出结果如下:
+----------------------------------+---------+-------------------------+------------+----------------------------------------------------------------------------------------------------------------------+ | SQL_ID | PLAN_ID | QUERY_SQL | OUTLINE_ID | OUTLINE_DATA | +----------------------------------+---------+-------------------------+------------+----------------------------------------------------------------------------------------------------------------------+ | 69AE2D9E3BF106CE009F93EFAF925EC8 | 3451 | select count(*) from t1 | -1 | /*+BEGIN_OUTLINE_DATA FULL(@"SEL$1" "TEST0113"."T1"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.2.1.0') END_OUTLINE_DATA*/ | +----------------------------------+---------+-------------------------+------------+----------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.028 sec)使用 SQL_ID 创建 Outline。
obclient [TEST0113]> CREATE OUTLINE outline_1 ON '69AE2D9E3BF106CE009F93EFAF925EC8' USING HINT /*+ parallel(2)*/ ; Query OK, 0 rows affected (0.921 sec)通过查询视图
DBA_OB_OUTLINES展示本租户的执行计划 Outline 信息。(V2.x 和 V3.x 版本中视图为GV$OUTLINE)obclient [TEST0113]> SELECT OUTLINE_ID,OUTLINE_NAME,SQL_ID FROM DBA_OB_OUTLINES;输出结果如下:
+------------+--------------+----------------------------------+ | OUTLINE_ID | OUTLINE_NAME | SQL_ID | +------------+--------------+----------------------------------+ | 529040 | OUTLINE_1 | 69AE2D9E3BF106CE009F93EFAF925EC8 | +------------+--------------+----------------------------------+ 1 row in set (0.029 sec)验证 Outline 绑定计划生效。
如果
OUTLINE_ID与在DBA_OB_OUTLINES中查到的OUTLINE_ID相同,则表示是按绑定的 Outline 生成的执行计划,如果是-1表示不是通过绑定 Outline 生成的计划。通过 SQL_ID 查询计划缓存视图
GV$OB_PLAN_CACHE_PLAN_STAT获取 OUTLINE 相关信息。(V2.x 和 V3.x 版本中视图为GV$PLAN_CACHE_PLAN_STAT)obclient [TEST0113]> SELECT SQL_ID,PLAN_ID,QUERY_SQL,OUTLINE_ID,OUTLINE_DATA FROM GV$OB_PLAN_CACHE_PLAN_STAT WHERE SQL_ID='69AE2D9E3BF106CE009F93EFAF925EC8';输出结果如下:
+----------------------------------+---------+-------------------------+------------+----------------------------------------------------------------------------------------------------------------------+ | SQL_ID | PLAN_ID | QUERY_SQL | OUTLINE_ID | OUTLINE_DATA | +----------------------------------+---------+-------------------------+------------+----------------------------------------------------------------------------------------------------------------------+ | 69AE2D9E3BF106CE009F93EFAF925EC8 | 3451 | select count(*) from t1 | -1 | /*+BEGIN_OUTLINE_DATA FULL(@"SEL$1" "TEST0113"."T1"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.2.1.0') END_OUTLINE_DATA*/ | +----------------------------------+---------+-------------------------+------------+----------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.089 sec)查询测试表 t1 内容。
obclient [TEST0113]> SELECT COUNT(*) FROM t1;输出结果如下:
+----------+ | COUNT(*) | +----------+ | 3 | +----------+ 1 row in set (0.011 sec)再次通过 SQL_ID 查询计划缓存视图
GV$OB_PLAN_CACHE_PLAN_STAT获取 OUTLINE 相关信息。(V2.x 和 V3.x 版本中视图为GV$PLAN_CACHE_PLAN_STAT)obclient [TEST0113]> SELECT SQL_ID,PLAN_ID,QUERY_SQL,OUTLINE_ID,OUTLINE_DATA FROM GV$OB_PLAN_CACHE_PLAN_STAT WHERE SQL_ID='69AE2D9E3BF106CE009F93EFAF925EC8';输出结果如下:
+----------------------------------+---------+-------------------------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | SQL_ID | PLAN_ID | QUERY_SQL | OUTLINE_ID | OUTLINE_DATA | +----------------------------------+---------+-------------------------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 69AE2D9E3BF106CE009F93EFAF925EC8 | 3474 | select count(*) from t1 | 529040 | /*+BEGIN_OUTLINE_DATA GBY_PUSHDOWN(@"SEL$1") PARALLEL(@"SEL$1" "TEST0113"."T1"@"SEL$1" 2) FULL(@"SEL$1" "TEST0113"."T1"@"SEL$1") PARALLEL(2) OPTIMIZER_FEATURES_ENABLE('4.2.1.0') END_OUTLINE_DATA*/ | +----------------------------------+---------+-------------------------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.019 sec)
使用 SQL_TEXT 创建 Outline
创建测试表 t1。
obclient [TEST0113]> CREATE TABLE t1(c1 INT,c2 INT,c3 INT); Query OK, 0 rows affected (0.176 sec)插入测试数据。
obclient [TEST0113]> INSERT INTO t1 VALUES(1,1,1),(2,2,2),(3,3,3); Query OK, 3 rows affected (0.120 sec) Records: 3 Duplicates: 0 Warnings: 0提交插入数据。
obclient [TEST0113]> COMMIT; Query OK, 0 rows affected (0.013 sec)查询测试表 t1 内容。
obclient [TEST0113]> SELECT * FROM t1;输出结果如下:
+------+------+------+ | C1 | C2 | C3 | +------+------+------+ | 1 | 1 | 1 | | 2 | 2 | 2 | | 3 | 3 | 3 | +------+------+------+ 3 rows in set (0.093 sec)查询全局 SQL 审计表
GV$OB_SQL_AUDIT获取实际的 SQL 语句的 SQL_ID。(V2.x 和 V3.x 版本中视图为GV$SQL_AUDIT)obclient [TEST0113]> SELECT SQL_ID FROM GV$OB_SQL_AUDIT WHERE QUERY_SQL LIKE 'SELECT * FROM t1';输出结果如下:
+----------------------------------+ | SQL_ID | +----------------------------------+ | 6F85AFBFA98A19D78AB7FD9D46ED3C0C | +----------------------------------+ 1 row in set (0.108 sec)通过 SQL_ID 查询计划缓存视图
GV$OB_PLAN_CACHE_PLAN_STAT获取 OUTLINE 相关信息。(V2.x 和 V3.x 版本中视图为GV$PLAN_CACHE_PLAN_STAT)obclient [TEST0113]> SELECT SQL_ID,PLAN_ID,QUERY_SQL,OUTLINE_ID,OUTLINE_DATA FROM GV$OB_PLAN_CACHE_PLAN_STAT WHERE SQL_ID='6F85AFBFA98A19D78AB7FD9D46ED3C0C';输出结果如下:
+----------------------------------+---------+------------------+------------+----------------------------------------------------------------------------------------------------------------------+ | SQL_ID | PLAN_ID | QUERY_SQL | OUTLINE_ID | OUTLINE_DATA | +----------------------------------+---------+------------------+------------+----------------------------------------------------------------------------------------------------------------------+ | 6F85AFBFA98A19D78AB7FD9D46ED3C0C | 4508 | SELECT * FROM t1 | -1 | /*+BEGIN_OUTLINE_DATA FULL(@"SEL$1" "TEST0113"."T1"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.2.1.0') END_OUTLINE_DATA*/ | +----------------------------------+---------+------------------+------------+----------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.019 sec)使用 SQL_TEXT 创建 Outline。
obclient [TEST0113]> CREATE OUTLINE outline_1 ON SELECT /*+ PARALLEL(2)*/ * FROM t1; Query OK, 0 rows affected (0.63 sec)通过查询视图
DBA_OB_OUTLINES展示本租户的执行计划 Outline 信息。(V2.x 和 V3.x 版本中视图为GV$OUTLINE)obclient [TEST0113]> SELECT OUTLINE_ID,OUTLINE_NAME,SQL_ID FROM DBA_OB_OUTLINES;输出结果如下:
+------------+--------------+----------------------------------+ | OUTLINE_ID | OUTLINE_NAME | SQL_ID | +------------+--------------+----------------------------------+ | 529047 | OUTLINE_1 | 6F85AFBFA98A19D78AB7FD9D46ED3C0C | +------------+--------------+----------------------------------+ 1 row in set (0.198 sec)验证 Outline 绑定计划生效。
如果
OUTLINE_ID与在DBA_OB_OUTLINES中查到的OUTLINE_ID相同,则表示是按绑定的 Outline 生成的执行计划,如果是-1表示不是通过绑定 Outline 生成的计划。通过 SQL_ID 查询计划缓存视图
GV$OB_PLAN_CACHE_PLAN_STAT获取 OUTLINE 相关信息。(V2.x 和 V3.x 版本中视图为GV$PLAN_CACHE_PLAN_STAT)obclient [TEST0113]> SELECT SQL_ID,PLAN_ID,QUERY_SQL,OUTLINE_ID,OUTLINE_DATA FROM GV$OB_PLAN_CACHE_PLAN_STAT WHERE SQL_ID='6F85AFBFA98A19D78AB7FD9D46ED3C0C';输出结果如下:
+----------------------------------+---------+------------------+------------+----------------------------------------------------------------------------------------------------------------------+ | SQL_ID | PLAN_ID | QUERY_SQL | OUTLINE_ID | OUTLINE_DATA | +----------------------------------+---------+------------------+------------+----------------------------------------------------------------------------------------------------------------------+ | 6F85AFBFA98A19D78AB7FD9D46ED3C0C | 4508 | SELECT * FROM t1 | -1 | /*+BEGIN_OUTLINE_DATA FULL(@"SEL$1" "TEST0113"."T1"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.2.1.0') END_OUTLINE_DATA*/ | +----------------------------------+---------+------------------+------------+----------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.021 sec)查询测试表 t1 内容。
obclient [TEST0113]> SELECT * FROM t1;输出结果如下:
+------+------+------+ | C1 | C2 | C3 | +------+------+------+ | 1 | 1 | 1 | | 2 | 2 | 2 | | 3 | 3 | 3 | +------+------+------+ 3 rows in set (0.015 sec)通过 SQL_ID 查询计划缓存视图
GV$OB_PLAN_CACHE_PLAN_STAT获取 OUTLINE 相关信息。(V2.x 和 V3.x 版本中视图为GV$PLAN_CACHE_PLAN_STAT)obclient [TEST0113]> SELECT SQL_ID,PLAN_ID,QUERY_SQL,OUTLINE_ID,OUTLINE_DATA FROM GV$OB_PLAN_CACHE_PLAN_STAT WHERE SQL_ID='6F85AFBFA98A19D78AB7FD9D46ED3C0C';输出结果如下:
+----------------------------------+---------+------------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | SQL_ID | PLAN_ID | QUERY_SQL | OUTLINE_ID | OUTLINE_DATA | +----------------------------------+---------+------------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 6F85AFBFA98A19D78AB7FD9D46ED3C0C | 4533 | SELECT * FROM t1 | 529047 | /*+BEGIN_OUTLINE_DATA PARALLEL(@"SEL$1" "TEST0113"."T1"@"SEL$1" 2) FULL(@"SEL$1" "TEST0113"."T1"@"SEL$1") PARALLEL(2) OPTIMIZER_FEATURES_ENABLE('4.2.1.0') END_OUTLINE_DATA*/ | +----------------------------------+---------+------------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.082 sec)
说明
- 创建 Outline 需要进入对应的数据库下执行。
- Hint 格式为
/\*+ xxx \*/,关于 Hint 说明的详细信息,请参见 Optimizer Hint。 - 使用 SQL_TEXT 方式创建的 Outline 会覆盖 SQL_ID 方式创建的 Outline。SQL_TEXT 方式创建的优先级更高。
- 如果 SQL_ID 对应的 SQL 语句已经有 Hint,则创建 Outline 指定的 Hint 会覆盖原始语句中所有 Hint。
- 使用 SQL_TEXT 方式创建的 Outline,严格要求原 SQL 文本与去掉 Hint 后的 SQL 文本完全匹配。
适用版本
OceanBase 数据库 V2.x、V3.x、V4.x 版本。
参考
计划绑定。