暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

OceanBase管理数据库计划绑定(二)

2023-08-11
365

确定 Outline 创建生效

确定创建的 Outline 是否成功且符合预期,需要进行如下三步的验证:

  1. 确定 Outline 创建成功。

    通过查看 DBA_OB_OUTLINES 视图,确认是否成功创建对应名称的 Outline。

    obclient> SELECT * FROM DBA_OB_OUTLINES WHERE OUTLINE_NAME = 'otl_idx_c2'\G 
    
    *************************** 1. row ***************************
            tenant_id: 1001
          database_id: 1100611139404776
           outline_id: 1100611139404777
        database_name: test
         outline_name: otl_idx_c2
    visible_signature: SELECT * FROM t1 WHERE c2 = ?
             sql_text: SELECT/*+ index(t1 idx_c2)*/ * FROM t1 WHERE c2 = 1
       outline_target:
          outline_sql: SELECT /*+ BEGIN_OUTLINE_DATA INDEX(@"SEL$1" "test.t1"@"SEL$1" "idx_c2") END_OUTLINE_DATA*/* 
    FROM t1 WHERE c2 = 1
    
  2. 确定新的 SQL 是否通过绑定的 Outline 生成了新执行计划。

    当绑定 Outline 的 SQL 执行新的查询后,查询 gv$plan_cache_plan_stat 表中该 SQL 对应的计划信息中的 outline_id。如果 outline_id 与在 DBA_OB_OUTLINES 中查到的 outline_id 相同,则表示是按绑定的 Outline 生成的执行计划,否则不是。

    obclient> SELECT SQL_ID, PLAN_ID, STATEMENT, OUTLINE_ID, OUTLINE_DATA 
          FROM oceanbase.GV$OB_PLAN_CACHE_PLAN_STAT 
           WHERE STATEMENT LIKE '%SELECT * FROM t1 WHERE c2 =%'\G
    *************************** 1. row ***************************
          sql_id: ED570339F2C856BA96008A29EDF04C74
         plan_id: 17225
       statement: SELECT * FROM t1 WHERE c2 = ?
      outline_id: 1100611139404777
    outline_data: /*+ BEGIN_OUTLINE_DATA INDEX(@"SEL$1" "test.t1"@"SEL$1" "idx_c2") END_OUTLINE_DATA*/
    
  3. 确定生成的执行计划是否符合预期。

    确定是通过绑定的 Outline 生成的计划后,需要确定生成的计划是否符合预期,可以通过查询 GV$OB_PLAN_CACHE_PLAN_STAT 表查看 plan_cache 中缓存的执行计划形状,具体查看方式可参考

    实时执行计划展示

    obclient> SELECT OPERATOR, NAME FROM oceanbase.GV$OB_PLAN_CACHE_PLAN_STAT 
          WHERE TENANT_ID = 1001 AND IP = '10.10.10.1' 
           AND PORT = 30474 AND PLAN_ID = 17225;
    
    +--------------------+------------+
    | OPERATOR           | NAME       |
    +--------------------+------------+
    |  PHY_ROOT_TRANSMIT | NULL       |
    |   PHY_TABLE_SCAN   | t1(idx_c2) |
    +--------------------+------------+
    

删除 Outline

删除 Outline 后,对应 SQL 将不再依据所绑定的 Outline 重新生成执行计划。

删除 Outline 的语法如下:

DROP OUTLINE outline_name;

注意

删除 Outline 需要在 outline_name 中指定 Database 名,或者在 USE DATABASE 命令后执行删除操作。

计划绑定与执行计划缓存关系

  • 使用 SQL_TEXT 创建 Outline 后,SQL 请求生成新计划查找 Outline 使用的 Key 与计划缓存使用的 Key 是相同的,即均是 SQL 参数化后的文本串。

  • 当创建和删除 Outline 后,对应 SQL 有新的请求时,会触发执行计划缓存中对应执行计划失效,更新为根据绑定的 Outline 所生成的执行计划。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论