首批通过分布式安全可靠测评,为关键业务系统打造
CREATE FORMAT OUTLINE
更新时间:2026-04-10 11:58:36
描述
该语句用来创建模糊 Outline。可以通过两种方式创建模糊 Outline,一种是通过 SQL_TEXT(用户执行的带参数的原始语句),另一种是通过 SQL_ID 创建。
注意
创建 Outline 需要进入对应的用户下执行。
使用限制与注意事项
当 SQL_ID 相同时,使用 SQL_TEXT 方式创建的 Outline 会覆盖 SQL_ID 方式创建的 Outline,SQL_TEXT 方式创建的优先级更高。
此外,OceanBase 数据库通过 SQL_ID 区分不同的 SQL,而 SQL_ID 是通过 SQL_TEXT 取 MD5 加密得到的,相同的 SQL 文本即使多一个换行或制表符,MD5 得到的 SQL_ID 都会不同。在实际生产系统中,推荐通过 SQL_ID 进行 Outline 绑定。
语法
/* 使用 SQL_TEXT 创建 Outline */
CREATE [OR REPLACE] FORMAT OUTLINE outline_name ON format_stmt [ TO format_target_stmt ]
/* 使用 SQL_ID 创建 Outline */
CREATE [OR REPLACE] FORMAT OUTLINE outline_name ON format_sql_id USING HINT hint;
参数解释
| 参数 | 描述 |
|---|---|
| outline_name | 指定要创建的模糊 Outline 名称。 |
| OR REPLACE | 如果指定 OR REPLACE,并且要创建的 Outline 已存在,则替换原有的 Outline。 |
| format_stmt | 表示原始 SQL 经过一系列规则的改写后得到的 format_stmt。通常,这种 stmt 可以通过一些表达式或 DBMS 包获取。 |
| TO format_target_stmt | 与 format_stmt 获取方式相同,但需要注意,如果期望对含有 HINT 的语句进行固定计划,则应使用 format_target_stmt 指明原始 SQL。在使用 TO format_target_stmt 子句时,要求原始 SQL format_stmt 与 format_target_stmt 在去掉 HINT 后完全匹配。 |
| format_sql_id | 需要绑定的 SQL 对应的经过一系列规则改写后得到的 format_stmt,然后根据 format_stmt 计算 MD5 值得到的 format_sql_id。 |
示例
创建一个 employees 表,并插入数据:
-- 创建表
CREATE TABLE employees (
employee_id INT,
employee_name VARCHAR(50),
department_id INT
);
-- 插入数据
INSERT INTO employees (employee_id, employee_name, department_id) VALUES
(1, 'John', 10),
(2, 'Jane', 20),
(3, 'Doe', 10),
(4, 'Alice', 20),
(5, 'Bob', 30);
使用 SQL_TEXT 创建 Outline 的示例:
-- 创建 Outline
CREATE FORMAT OUTLINE my_outline ON 'SELECT * FROM employees WHERE department_id = ?';
-- 使用 Outline
SELECT /*+ my_outline */ * FROM employees WHERE department_id = 20;
在这个示例中,通过 CREATE FORMAT OUTLINE 使用 SQL_TEXT 创建了一个 Outline,然后在实际的 SQL 语句中通过注释 /*+ my_outline */ 使用了这个 Outline。
返回结果如下:
+-------------+---------------+---------------+
| employee_id | employee_name | department_id |
+-------------+---------------+---------------+
| 2 | Jane | 20 |
| 4 | Alice | 20 |
+-------------+---------------+---------------+
2 rows in set
使用 SQL_ID 创建 Outline 的示例:
-- 获取 SQL_ID
SELECT SQL_ID FROM v$sql WHERE sql_text = 'SELECT * FROM employees WHERE department_id = ?';
-- 创建 Outline
CREATE FORMAT OUTLINE my_sql_id_outline ON SQL_ID 'b5mgha4x5gs1j';
-- 使用 Outline
SELECT /*+ my_sql_id_outline */ * FROM employees WHERE department_id = 10;
在这个示例中,首先通过查询 v$sql 视图获取了 SQL 语句的 SQL_ID,然后通过 CREATE FORMAT OUTLINE 使用 SQL_ID 创建了一个 Outline,并在实际的 SQL 语句中通过注释 /*+ my_sql_id_outline */ 使用了这个 Outline。
返回结果如下所示:
+-------------+---------------+---------------+
| employee_id | employee_name | department_id |
+-------------+---------------+---------------+
| 1 | John | 10 |
| 3 | Doe | 10 |
+-------------+---------------+---------------+
2 rows in set