Oracle数据库序列和同义词概述

Oracle数据库序列和同义词概述

序列介绍

序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。不占用磁盘空间,占用内存。

其主要用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。

序列是一种模式对象,多个用户可以用它来生成唯一整数。

序列发生器提供高可扩展性的和性能良好的方法,来为数字数据类型生成代理键。

序列特征

序列的名称

序列的初始值、最小值、最大值

序列是升序还是降序

每个生成的序号之间的间隔

数据库是否要在内存中缓存生成的序列号集合

当超过最大限值时序列是否要重复

简单案例

复制代码
创建一个简单序列:
CREATE SEQUENCE customers_seq
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
对 customers_seq.nextval 的第一次引用会返回 1000。
第二次引用返回1001。每个后续引用的返回值比前一个引用大 1。
//INCREMENT BY 1  每次序号增长为1
//START WITH 1000 表示序列从1000开始
//NOCACHE   表示不在内存中缓存生成的序列号集合
//NOCYCLE   表示当超过最大限值时序列不重复

序列的限制

不能在CHECK约束中使用

不能在视图查询、物化视图、子查询中使用

不能使用DEFAULT关键字将列设置为自动递增

使用序列的优化建议

尽可能,建议将序列都缓存至内存,且cache大小建议1000以上。

对序列的并发访问

同一序列发生器可以为多个表生成编号。以这种方式,数据库可以自动生成主键,并协调跨多个行或表的键。例如,序列可以为 orders 表和customers 表生成主键。

序列发生器可用于在多用户环境中生成唯一编号,不会引起磁盘 I/O 开销或事务锁定。

每个引用序列的用户都有权访问他或她的当前序列号,即在该会话中生成的最后一个序列值。

用户可以发出一个语句生成一个新的序列号,或使用该会话最后生成的当前序列号。

**生成一个新的序列号方法:**select customers_seq.nextval from dual;
查询该会话最后生成的当前序列号的方法: select customers_seq.currval from dual;

在某个会话中的一个语句生成了一个序列号后,只有该会话可以使用它。
单个序列号可以跳过,如果个别序列号在某个事务中被生成使用,而最终被回滚,则它们会被跳过(而变得不连续)。

注意:如果应用程序需要没有间隙的一组数字,Oracle数据库中的序列无法实现,必须在数据库中使用自己开发的代码来序列化你的程序行为。

创建序列

复制代码
序列的创建语法如下:
  CREATE SEQUENCE 序列名
  [INCREMENT BY n]
  [START WITH n]
  [{MAXVALUE/ MINVALUE n| NOMAXVALUE}]
  [{CYCLE|NOCYCLE}]
  [{CACHE n| NOCACHE}];
    其中:
1)  INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。
2)  START WITH 定义序列的初始值(即产生的第一个值),默认为1。
3)  MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
4)  MINVALUE定义序列生成器能产生的最小值。
5)  CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。
6)  CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。
大量语句发生请求,申请序列时,为了避免序列在运用层实现序列而引起的性能瓶颈。Oracle序列允许将序列提前生成 cache x个先存入内存,在发生大量申请序列语句时,可直接到运行最快的内存中去得到序列。但cache个数也不能设置太大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入cache x个。这种情况也能会在数据库关闭时也会导致序号不连续。
7)  NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用。引用方法:序列名.NEXTVAL
8)  CURRVAL 中存放序列的当前值,引用方法:序列名.CURRVAL;currval使用之前,必须先在该会话中产生一个序列值,也就是说,必须先执行一次NEXTVAL,CURRVAL才能执行。如果序列还没有通过调用NEXTVAL产生过序列的下一个值,直接引用CURRVAL没有意义。

修改序列

修改序列的注意事项:

1、必须是序列的拥有者或对序列有 ALTER any sequence权限

2、只有将来的序列值会被改变

3、改变序列的初始值只能通过删除序列之后重建序列的方法实现

复制代码
Alter sequence示例:
ALTER SEQUENCE emp_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE;
//INCREMENT BY 10每次增长调整为10
//最大值调整为10000
//序列循环使用

查询序列

1、通过数据字典USER_OBJECTS可以查看用户拥有的序列。

2、通过数据字典USER_SEQUENCES可以查看序列的设置。

删除序列

drop SEQUENCE seq_test1;

SESSION 参数(12C特性)

指定创建会话序列,仅自己会话中可用,会话消失则会话序列也会消失。

会话序列将忽略 cache、nocache、order、noorder 参数

如下:

CREATE SEQUENCE seq_test1 START WITH 1000 INCREMENT BY 1 session;

自适应序列(18c新增特性)

用于优化使用序列作为主键列,当insert过于频繁时,出现索引块分裂的问题 (序列的数值一直在不断地增长,通常每次增加一。每一个新增的条目都会被放在索引的最右边叶子块,会使得这个叶子块非常的热,从而产生争用,如果是在一起RAC集群当中,那么就会争用的更加厉害,会导致更多的集群等待事件)

为了改善以序列值作为键值的表的数据加载性能,从Oracle 18.1数据库开始,自适应序列 (Scalable Sequences) 被引入这个特性为序列提供了添加 instance 和 session 偏移量的选项 ,当跨 RAC节点加载数据或者单实例多个进程并发加载数据时,可以显著减少序列争用和索引块争用的可能性。

这个新特性的好处是,在以序列作为键值的表的数据加载时,它通过减少争用来进一步提升Oracle数据库加载数据的能力。在创建序列的时候,将 instance 和 session 的 id 添加到序列的值中,这样在生成序列值时产生的争用和 insert 键值时产生的索引块争用可以显著的减少。这表明Oracle数据库数据的数据加载能力可以进一步扩展,并且可以支撑更高速率的数据加载。

SCALE/NOSCALE

当 SCALE 被指定的时候,一个数字偏移量会附着在序列值的开头。

偏移量的表现形式为 iii||sss|| ,具体解释如下:

iii 表现为一个3个数字的instance偏移量,数值来源为: (instance_id % 100) + 100,

sss 表现为一个3个数字的instance偏移量,数值来源为:(session_id % 1000)

|| 是连接符

EXTEND/NOEXTEND

当 EXTEND 和 SCALE 关键字同时被指定时,产生的序列值的长度都是 (x+y),这里 x 是自适应偏移量 (默认是6),而 y 则是序列的 maxvalue/minvalue 关键字限定的最大值的数字位数。举例来说,如果一个升序的序列,maxvalue 被指定为100,并且指定了SCALABLE EXTEND关键字,那么产生的序列值的表现形式为 iii||sss||001,iii||sss||002 ... iii||sss||100

默认情况下 SCALE 是 NOEXTEND 的,当 NOEXTEND 被设置时,产生的序列值长度最大只能是序列 maxvalue/minvalue 关键字限定的最大值的数字位数。在某些应用中,序列被用来填充固定宽度的列,那么在整合这些应用时,这个设定很有用。在调用一个 SCALABLE NOEXTEND 的序列的 NEXTVAL 值时,如果产生的序列值需要的数字位数比 maxvalue/minvalue 限定的最大值位数更大,那么一个用户错误会被抛出。

案例1

复制代码
create sequence my_seq minvalue 1 maxvalue 9999999999 scale;  //默认为NOEXTEND
Sequence created.
SQL> select my_seq.nextval as scale_seq from dual;
 SCALE_SEQ
----------
1013910001
SQL> select my_seq.nextval as scale_seq from dual;
 SCALE_SEQ
----------
1013910002
101为(instance_id % 100) + 100
391为(session_id % 1000)

案例2

复制代码
col scale_seq for 999999999999999999
create sequence my_seq1 minvalue 1 maxvalue 9999999999 scale extend;
Sequence created.

select my_seq1.nextval as scale_seq from dual;
          SCALE_SEQ
-------------------
   1013910000000001
select my_seq1.nextval as scale_seq from dual;
          SCALE_SEQ
-------------------
   1013910000000002

查询数据库中存在的自适应序列

复制代码
column sequence_name format a30
column scale_flag format a10
column extend_flag format a10
select sequence_name,
       scale_flag,
       extend_flag
from   user_sequences
where  sequence_name = 'MY_SEQ1';
SEQUENCE_NAME                  SCALE_FLAG EXTEND_FLA
------------------------------ ---------- ----------
MY_SEQ1                         Y          Y

同义词概述

同义词介绍

同义词是一个模式对象的别名。例如,可以为一个表或视图、 序列、PL/SQL 程序单元、 用户定义的对象类型、或另一个同义词等创建同义词。

同义词只是一个别名,因此除了要在数据字典存储其定义之外,不需要其它存储。

同义词可以为数据库用户简化 SQL 语句。

同义词也可以用于隐藏底层模式对象的标识和位置。

如果必须重命名或移动底层对象,仅需要重新定义同义词。基于同义词的应用程序,可以无需修改而继续工作。

您可以创建私有同义词和公共同义词。私有同义词与其所有者在同一个模式中,只有其所有者对其可用性具有控制权。

公共同义词由名为 PUBLIC 的用户组所有,并且能被每一个数据库用户访问。

在一个同义词上授予对象权限时,其实是在底层对象上授予权限。同义词在 GRANT 语句中只作为对象的别名。

尽量少用公共同义词,因为它们使数据库整合更困难。另外,公共同义词必须全局唯一,不能有同名的公共同义词。

案例

复制代码
普通用法如下所示:
CREATE [OR REPLACE] [PUBLIC] SYNONYM [ schema.] 同义词名称 FOR [ schema.] object [ @dblink ];

--专有(私有)同义词
CREATE SYNONYM SYSN_TEST FOR TEST;
--公共同义词
CREATE PUBLIC SYNONYM PUBLIC_TEST FOR TEST;
同义词权限注意事项

1、用户在自己的模式下创建私有同义词,这个用户必须拥有CREATE SYNONYM权限,否则不能创建私有同义词。

2、如果是引用其它模式下的对象,创建本用户下的私有同义词,必须具备那个模式对象的查询权限。

3、创建公共同义词,必须具备CREATE PUBLIC SYNONYM权限。

4、如果是在其它模式下创建同义词,则需要CREATE ANY SYNONYM的权限。

同义词元数据查询

DBA_SYNONYMS数据字典视图

相关推荐
treesforest1 小时前
Ipdatacloud IP 地址查询方案适合哪些场景?
大数据·网络·数据库·网络协议·tcp/ip·ip
TeDi TIVE1 小时前
C#数据库操作系列---SqlSugar完结篇
网络·数据库·c#
你觉得脆皮鸡好吃吗1 小时前
SQL注入 高权限注入(引入概念)
网络·数据库·sql·oracle·网络安全学习
数智化精益手记局2 小时前
4m变更管理实战:拆解4m变更管理四大要素的管控功能与常见难题
大数据·数据结构·数据库·人工智能·精益工程
pele2 小时前
如何解决多线图中线条颜色不渲染(仅标记和提示框显示颜色)的问题
jvm·数据库·python
银河系的一束光2 小时前
net start mysql 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助
数据库·mysql
forEverPlume2 小时前
golang如何排查大量goroutine性能问题_golang大量goroutine性能排查详解
jvm·数据库·python
2401_883600252 小时前
Golang怎么CGO交叉编译_Golang如何在交叉编译时处理CGO依赖问题【避坑】
jvm·数据库·python
Irene19912 小时前
(课堂笔记)SQL基础语法分类总结表
数据库·sql