请详细介绍一下outline功能和相关作用
1 个赞
在 OceanBase 数据库中,Outline 功能主要用于计划绑定。通过创建 Outline,可以将一组 Hint 固定到特定的 SQL 上,从而确保优化器每次执行这条 SQL 时都会遵循这些 Hint 生成执行计划,而不是依赖于优化器默认的选择。
创建 Outline
Outline 可以通过两种方式创建:
- 通过 SQL_TEXT: 用户执行的带参数的原始语句。这种方式创建的 Outline 优先级更高,会覆盖通过 SQL_ID 创建的 Outline。
- 通过 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 OUTLINE
和 ALTER 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
命令。
详情请参考:
4 个赞