sql执行相关问题

请详细介绍一下outline功能和相关作用

1 个赞

@论坛小助手

在 OceanBase 数据库中,Outline 功能主要用于计划绑定。通过创建 Outline,可以将一组 Hint 固定到特定的 SQL 上,从而确保优化器每次执行这条 SQL 时都会遵循这些 Hint 生成执行计划,而不是依赖于优化器默认的选择。

创建 Outline

Outline 可以通过两种方式创建:

  1. 通过 SQL_TEXT: 用户执行的带参数的原始语句。这种方式创建的 Outline 优先级更高,会覆盖通过 SQL_ID 创建的 Outline。
  2. 通过 SQL_ID: 通过 SQL 的唯一标识符创建。SQL_ID 是通过 SQL_TEXT 取 MD5 加密得到的,相同的 SQL 文本即使多一个换行或制表符,MD5 得到的 SQL_ID 都会不同。因此,在实际生产系统中,推荐通过 SQL_ID 进行 Outline 绑定。

删除 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 所生成的执行计划。

计划绑定与限流规则的关系

从 OceanBase 数据库 4.2.2 版本开始,CREATE OUTLINEALTER OUTLINE 命令扩展了功能。除了原有的绑定特定查询的执行计划外,还允许用户为查询设置最大并发执行次数的限制。限流功能能够帮助更有效地管理数据库负载,防止因高并发查询而导致的性能问题。
例如:

  • 使用 CREATE OUTLINE 创建了一个 OUTLINE,其中包含了 USE_NL(tbl2) 提示,这告诉优化器对于表 tbl2 使用 nest loop join,同时 MAX_CONCURRENT(1) 这个 Hint 表示同一时刻,只允许一个线程执行查询:
CREATE OUTLINE otl2 ON SELECT /*+ USE_NL(tbl2) MAX_CONCURRENT(1) */ * FROM t WHERE c1 = ?;
  • 同样地,使用 ALTER OUTLINE 修改现有 OUTLINE,同样可以达到上述效果。
ALTER OUTLINE otl2 ON SELECT /*+ USE_NL(tbl2) MAX_CONCURRENT(1) */ * FROM t WHERE c1 = ?;

Outline 视图

Outline 视图为 DBA_OB_OUTLINES,其字段说明如下:

字段名称 类型(MySQL 模式) 类型(Oracle 模式) 描述
CREATE_TIME TIMESTAMP(6) TIMESTAMP(6) 创建时间戳
MODIFY_TIME TIMESTAMP(6) TIMESTAMP(6) 修改时间戳
TENANT_ID BIGINT(20) NUMBER(38) 租户 ID
DATABASE_ID BIGINT(20) NUMBER(38) 数据库 ID
OUTLINE_ID BIGINT(20) NUMBER(38) Outline ID
DATABASE_NAME VARCHAR2(128) VARCHAR2(128) 数据库名称
OUTLINE_NAME VARCHAR2(128) VARCHAR2(128) Outline 名称
VISIBLE_SIGNATURE LONGTEXT CLOB Signature 的反序列化结果
SQL_TEXT LONGTEXT CLOB 创建 Outline 时,在 ON 子句中指定的 SQL
OUTLINE_TARGET LONGTEXT CLOB 创建 Outline 时,在 TO 子句中指定的 SQL
OUTLINE_SQL LONGTEXT CLOB 具有完整 Outline 信息的 SQL
SQL_ID VARCHAR2(32) VARCHAR2(32) SQL 标识符
OUTLINE_CONTENT LONGTEXT CLOB 完整的执行计划 Outline 信息

注意事项

  • 创建 Outline 需要进入对应的数据库下执行。
  • 删除 Outline 时需要指定正确的 Database 名或使用 USE DATABASE 命令。

详情请参考:

  1. CREATE OUTLINE
  2. 计划绑定
  3. 阅读和管理 OceanBase 数据库 SQL 执行计划
4 个赞

:thinking::thinking: