#CREATE OUTLINE

# 通用描述

CREATE OUTLINE用于创建一个存储纲要,保存在指定SQL上的指定hint信息,当某个SQL语句存在OUTLINE信息时,优化器在非例外的情况下将会依据这个OUTLINE生成执行计划。这将使固定的SQL语句的执行计划变得稳定,不会由于运行环境、统计信息波动而导致优化器生成用户不期望的执行计划。

启用存储纲要的目的是为了对优化器的自动处理进行人工干预,详细信息可参考性能调优SQL调优原理与规则。需说明的是,在大多数情况下,用户应该更相信优化器所作的判断,采纳优化器自动生成的执行计划,除非能准确地预见到在某段时间OUTLINE是更好的选择,则可以手动地打开控制开关,使用OUTLINE。

用户必须拥有CREATE ANY OUTLINE权限才能创建一个存储纲要。

# 语句定义

create_outline::=

syntax
CREATE OR REPLACE PUBLIC OUTLINE outline_name FROM PUBLIC source_outline FOR CATEGORY category_name ON statement

# or replace

替换已有的OUTLINE。

# public

公有模式,默认值。

# outline_name

将要创建的OUTLINE的名称,不能与已有OUTLINE名称重复,不能带模式名指定,且需符合YashanDB的对象命名规范。 若省略,系统将根据当前时间自动生成一个OUTLINE名称。

# from source_outline

使用本语句表示从一个已有的OUTLINE进行复制创建。

对于此种方式创建的OUTLINE,必须为其指定一个与源OUTLINE不同的类别,且不能同时使用ON statement。

# for category category_name

指定OUTLINE归属的类别,省略此语句时,系统将默认归属到DEFAULT类别。

category_name为类别的名称,可以为已存在的一个类别名,或者为新指定的一个类别名。category_name不能带模式名指定,且需符合YashanDB的对象命名规范

对于同一个SQL语句,不能将其重复指定到同一个类别。

# on statement

指定OUTLINE对应的SQL语句。SQL语句必须为如下类型中的一种且需遵循相应的语法要求:

  • SELECT语句
  • DELETE语句
  • UPDATE语句
  • INSERT...SELECT语句
  • CRAETE TABLE ... AS SELECT语句

对于违反语法要求的SQL语句,OUTLINE将创建失败且提示错误信息。

示例

-- 对给定的SQL创建OUTLINE。
CREATE OUTLINE ol_a FOR CATEGORY ctgy_ab ON 
SELECT /*+ FULL(a) */ a.area_name
FROM area a
WHERE a.area_no LIKE '01';

-- 对给定的源outline 进行复制,且归属到默认的DEFAULT类别 
CREATE OUTLINE ol_a1 FROM ol_a;