使用 Outline 绑定执行计划 #
语法 #
CREATE [OR REPLACE] OUTLINE outline_name ON stmt [ TO target_stmt ];
# 或
CREATE [OR REPLACE] OUTLINE outline_name ON 'SQLID' using 'HINTS';
通过语句文本(用户执行的带参数的原始语句)或者 SQLID 都可以创建 Outline。不过由于文本中空格和换行如果有差异就会导致匹配不上,所以不建议通过文本创建 Outline(除非文本非常简单)。这里通过 SQLID 来创建 Outline,只要 SQL 文本不变,SQLID 就不会变。
Outline 的用法也是通过 SQL Hint 固定 SQL 的执行计划,可以调整表连接算法、使用的索引等等。
示例 #
下面示例还是针对前面测试 SQL,尝试调整一下执行计划里表连接顺序。
执行原 SQL,通过视图 gv$ob_sql_audit 或 gv$ob_plan_cache_plan_stat 找到该 SQL 的 SQLID。
根据 SQLID 创建 Outline,指定 HINTS。
create outline otl_test_1 on "9D276020142C5B8259B85C3E8966C579" using hint /*+ leading(i) */ ; MySQL [tpccdb]> select * from oceanbase.__all_outline \G *************************** 1. row *************************** gmt_create: 2023-06-15 14:04:13.366369 gmt_modified: 2023-06-15 14:04:13.366369 tenant_id: 0 outline_id: 500008 database_id: 500001 schema_version: 1686809053365736 name: otl_test_1 signature: outline_content: /*+leading(i) */ sql_text: owner: root used: 0 version: 101010022023051821-f7379b26f8cd11f026e06846043550f9e0d42ead compatible: 1 enabled: 1 format: 0 outline_params: ���� outline_target: sql_id: 84954A52770C87F243CE1FD58EE60B7F owner_id: NULL 1 row in set (0.007 sec)
删除 Outline
drop outline otl_test_1 ;
删除 Outline 后,该 SQL ID 的执行计划重新生成,又回归到原始的执行计划了。