使用 Outline 绑定执行计划

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