Skip to main content

使用 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 的执行计划重新生成,又回归到原始的执行计划了。

Loading...