按关键词阅读:
文章插图
作者介绍
洪烨 , openGauss Contributor , 多年银行业系统架构设计及DBA实战经验 , 《DB2数据库内部解析与性能调优》作者 。
除了最常用的数据库表外 , 数据库的逻辑对象还包括索引、约束、视图、序列、同义词等 , 接下来我们将逐一评估Oracle对象在openGauss中的兼容性 。
一、索引
索引是一种特殊的数据结构 , 能够快速定位到所要查找的数据 。 为了提高查询效率 , 在创建表之后通常需要在关键字段上创建索引 。 按照数据结构分类 , Oracle数据库中的索引分为B*树索引及位图索引 。
1、B*树索引
B*树索引是数据库中最常用的索引类型 , 所有的叶子节点数据构成了一个有序链表 。
在Oracle数据库中大多数情况下创建的索引都属于B*树索引 , 按照使用场景进行细分 , 可以分为常规索引、复合索引、唯一索引、反向索引、基于函数的索引、全局索引 。
1)常规索引:
基于表中单个列建立的索引 , 也是最简单的索引创建方式 , 无需额外关键字 , 索引默认按照升序排序 。
postgres=# create index single_index on product(name);
CREATE INDEX
2)复合索引:
基于表中多个列创建索引 。
postgres=# create index mutli_index on product(id,name);
CREATE INDEX
3)唯一索引:
创建索引时 , 通过指定unique关键字限制索引列中的值必须唯一 , 与唯一约束功能类似 。
postgres=# create unique index unique_index on product(id,name);
CREATE INDEX
4)反向索引:
索引列按照降序进行排序 , 在Oracle中通过REVERSE关键字进行创建 , 但openGauss中不支持关键字REVERSE , 可以通过指定DESC关键字进行替代 。
postgres=# create index reverse_index on product(name) REVERSE;
ERROR: syntax error at or near "REVERSE"
LINE 1: create index reverse_index on product(name) REVERSE;
postgres=# create index reverse_index on product(name desc);
CREATE INDEX
5)基于函数的索引:
基于函数的索引适用于某个字段做查询的时候经常带函数操作 , openGauss中可以支持基于函数的索引 。
postgres=# CREATE INDEX func_index ON product(trunc(name));
CREATE INDEX
6)分区索引:
分区表的数据量通常较大 , 随着数据增大 , 会导致分区表上的B*树的索引的性能下降 , 维护成本也随之升高 。 对于分区表而言 , 基于每个分区进行索引创建则十分必要 。 创建分区索引需要加local关键字 , openGauss可以支持分区索引的场景 。
postgres=# CREATE TABLE t_range_partition
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
) PARTITION BY RANGE (time_id)
(PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy')) TABLESPACE pg_default, PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy')) TABLESPACE pg_default, PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy')) TABLESPACE pg_default, PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')) TABLESPACE pg_default );
CREATE TABLE
postgres=# create index IDX_PARTI_RANGE_ID on t_range_partition(prod_id) local;
CREATE INDEX
2、位图索引
位图索引的存储结构与B*树差异较大 , ROWID并不直接存储 。 位图的每个位置映射到一个可能的ROWID上 , 位图上每个位置的内容用于表示该行特定的值是否在位图列中 。 所以 , 位图的每个位置存储特殊行和相关ROWID的信息 。 如果该ROWID的行的值匹配 , 则该特殊rowid位置存储为"1" , 否则储存为"0" 。
位图索引适用于该列只有几个枚举值的情况 , 比如性别字段 , 标示字段比如只有0和1的情况 。 openGauss当前版本暂不支持位图索引 。
postgres=# create bitmap index bit_index on product(name);
ERROR: syntax error at or near "bitmap"
LINE 1: create bitmap index bit_index on product(name);
二、约束
数据库约束用来防止无效的数据进入到表中 , 以保护数据的实体完整性 , 最常见的数据库约束就是主键 , 大多数SQL规范中都会包含建表需要定义主键 。 在Oracle数据库中 , 数据库约束分为5类:非空约束、主键约束、唯一约束、外键约束、检查约束 , openGauss可以兼容所有约束类型 。
1、非空约束(NOT )
如果在列上定义了非空约束 , 那么当插入数据时 , 必须保证数据不能为 , 如果数据为空则无法插入 , openGauss支持非空约束 。
postgres=# create table t_not(
id number not ,
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111T320352020.html
标题:Oracle的逻辑对象,openGauss都能hold住吗?