#CREATE ACCESS CONSTRAINT
# 通用描述
CREATE ACCESS CONSTRAINT用于在指定的表上创建一个AC对象。只能基于LSC表执行本语句来创建一个AC对象,且该LSC表不可以为组合分区表或INTERVAL类型的分区表。
创建AC后,系统将同时在后台生成AC数据,AC数据可被用于:
- 执行源表查询时,在满足AC条件的情况下,系统将使用AC进行有界计算,加速查询。
- 用户可以像查询表一样直接查询AC,查询结果为当前后台已生成的AC数据。
当源表为一个分区表时,所创建的AC也将分区,且其分区界值、数量、分区表空间、存储属性等与源表一致。
# 语句定义
create access constraint::=
xy_clause::=
column_expr::=
n_clause::=
where_clause::=
aggr_clause::=
order_clause::=
# ac_name
该语句用于指定创建的AC的名称,不可省略,且需符合YashanDB的对象命名规范。
# table_name
该语句用于指定要创建AC的源表。创建AC的操作过程中会对该表加排他锁。
# ac_model_clause
用于建立AC数据模型的语句。
# xy_clause
该语句用于指定AC里的x值和y值,可通过TO关键字建立x to y的模型,也可以通过ONLY关键字建立只包含y值的模型。相同的x值和y值组合上只能创建一次AC对象,除非该对象被删除。
x/y值均由一个或多个基于列字段的表达式组成,以,
分隔。
# column_expr
该语句用于指定x/y值基于列字段的表达式,表达式可以为:
- 要创建AC的表的列字段。
- 列字段与常数,或者列字段与列字段的四则运算式。
表达式中必须至少包含一个列字段,但所有包含在表达式中的列字段均不能为LOB大对象型。
可以为每个表达式指定一个别名,若未指定,则使用默认命名。若别名与其他别名或者默认别名重复则报错。
示例(LSC表)
CREATE ACCESS CONSTRAINT ac_area FROM area
ON area_no TO area_name,dhq;
# n_clause
该语句用于指定AC的边界大小,BOUND为系统预留关键字,无实际含义,可省略,则默认为int64最大值。
如果指定本语句,需满足如下约束规则:
- BOUND的值必须为正整数,上限为int64最大值,即9223372036854775807。
- 只可以指定为一个常数。
# where_clause
该语句用于设置AC数据的过滤条件,可省略,则表示获取所有数据。
# filter_clause
可用于AC模型数据过滤的条件包括:
- =,!=,>,>=,<,<=:此类条件操作数必须为列字段与列字段,或者列字段与常数。
- IS NULL,IS NOT NULL:必须对列字段进行此类条件判断。
- IN:须对列字段进行此类条件判断,且IN后的集合只能包含常数。
示例(LSC表)
DROP ACCESS CONSTRAINT ac_area;
CREATE ACCESS CONSTRAINT ac_area FROM area
ON area_name TO area_no,dhq
WHERE dhq IN ('Shanghai','Chengdu')
AND area_name IS NOT NULL;
# aggr_clause
该语句用于指定AC列的聚集信息,可省略,则表示不对列进行聚集。
可同时指定多个聚集信息,以,
分隔,但每个聚集信息只能针对一个列字段,可执行聚集的函数包括:
- SUM
- MAX
- MIN
- COUNT
上述聚集函数不可以进行嵌套,且不可以在单个AC中对相同列进行相同的聚集操作。
示例(LSC表)
DROP ACCESS CONSTRAINT ac_area;
CREATE ACCESS CONSTRAINT ac_area FROM area
ON area_name TO area_no,dhq
WHERE dhq IN ('Shanghai','Chengdu')
AND area_name IS NOT NULL
INCLUDE COUNT(dhq),MAX(area_no);
# order_clause
该语句用于指定AC的数据是否排序,省略则默认为ORDER。
# ac_attr_clause
该语句用于指定AC的表空间,省略则默认为源表的表空间。分布式部署中用户无法为在分布表上创建的AC指定表空间,使用表所在的表空间作为AC的表空间。
- tablespace_name:指定到一个存在的表空间。
- DEFAULT:指定到缺省表空间,即源表的表空间。
在LSC表上创建的AC对象,其表空间必须指定为一个databucket表空间。
示例(单机LSC表)
DROP ACCESS CONSTRAINT ac_area;
CREATE ACCESS CONSTRAINT ac_area FROM area
ON area_name TO area_no,dhq
NO ORDER
TABLESPACE DEFAULT;