从12c版本开始,Oracle引入了一系列新特性,这些更新不仅简化了数据库设计和管理流程,还增强了性能和可扩展性。本文将探讨几个关键的新特性,包括支持128字节标识符、32k VARCHAR2/NVARCHAR2类型支持、IDENTITY自增字段、自适应序列(Scalable Sequence)、LISTAGG聚合的DISTINCT选项以及Top-N查询处理技术。这些特性为开发人员提供了更强大的工具来构建高效且易于维护的数据驱动应用。
128字节标识符支持
在 Oracle数据库的DB12.2版本之前,对象名称的最大长度限制为30字节。这一限制在现代数据库设计中可能成为限制因素,因为随着应用的复杂性增加,对象名称往往需要更长以提供足够的描述性。自DB12.2开始,Oracle数据库将大多数标识符的最大长度扩展至128字节,为数据库设计者提供了更大的灵活性。
案例
案例一:创建长名称的表和列
CREATE
TABLE
"LongTableNameForStoringUserDetails" (
"VeryLongColumnNameForUserId"
NUMBER,
"AnotherLongColumnNameForUserName"
VARCHAR2(
100)
);
案例二:创建长名称的外键约束
ALTER
TABLE
"LongTableNameForStoringUserDetails"
ADD
CONSTRAINT
"FK_ConstraintNameForUserDetails_UserId"
FOREIGN
KEY (
"VeryLongColumnNameForUserId")
REFERENCES
"Users" (
"UserId");
32k VARCHAR2/NVARCHAR2支持
在Oracle 12c版本之前,数据库中VARCHAR2、NVARCHAR2和RAW列的最大大小受到限制,具体如下:
-
VARCHAR2: 最大4000字节 -
NVARCHAR2: 最大4000字节 -
RAW: 最大2000字节
这些限制在处理大量文本数据时可能成为瓶颈。为了解决这一问题,Oracle 12c引入了扩展数据类型,允许数据库列支持更大的存储容量:
-
VARCHAR2: 扩展至32767字节 -
NVARCHAR2: 扩展至32767字节 -
RAW: 扩展至32767字节
启用32k VARCHAR2支持
ALTER
SYSTEM
SET MAX_STRING_SIZE=
EXTENDED
SCOPE=
SPFILE;
案例:
CREATE
TABLE
"ApplicantDetails" (
"ApplicantID"
NUMBER
GENERATED
AS
IDENTITY,
"FirstName"
VARCHAR2(
30),
"LastName"
VARCHAR2(
30),
"ApplicationDate"
DATE,
"Resume"
VARCHAR2(
32767)
);
以下是根据您提供的内容整理的文章部分:
IDENTITY自增字段
在Oracle 12c版本之前,创建自增ID列需要多个步骤,包括创建主键表、序列和触发器。从Oracle 12c开始,引入了IDENTITY属性,简化了自增ID列的创建过程。
DB12c之前创建自增ID列的步骤:
-
创建以ID为主键的表:定义表结构并设置ID列为主键。 -
创建序列:用于生成唯一的自增数值。 -
创建触发器:在插入数据时自动填充ID列。
DB12c开始使用IDENTITY属性创建自增ID列的步骤:
创建一个包含id列的表,如果未提供id列,则自动填充该列(可手工填充id列):
CREATE
TABLE
test (
id
NUMBER
GENERATED
BY
DEFAULT
AS
IDENTITY (
START
WITH
100
INCREMENT
BY
10),
name
VARCHAR2(
30)
);
可以手工插入id值:
INSERT
INTO t2(
id,
name)
VALUES(
1,
'wy');
以下是根据您提供的内容整理的文章部分,并对对象名称进行了修改:
Oracle数据库新特性:自适应序列(Scalable Sequence)
自适应序列是Oracle数据库引入的一项新特性,旨在解决在大规模数据加载过程中,由于序列生成主键而导致的序列和索引块争用问题。这在单实例或 RAC(Real Application Clusters)数据库环境中尤为显著。通过减少这类争用,自适应序列能够提供更好的数据加载吞吐量。
自适应序列的工作原理
自适应序列通过在序列值上添加一个6位数字的前缀来实现其功能。这个前缀由两部分组成:
-
实例偏移量:由3位数字组成,计算方式为 (instance id % 100) + 100。 -
会话偏移量:由3位数字组成,计算方式为 session id % 1000。
最终的序列号格式为 "prefix || zero padding || sequence",其中零填充量取决于序列的定义。
案例:
18c之前
创建序列
CREATE
SEQUENCE normal_seq
INCREMENT
BY
1 MAXVALUE
1000000
CACHE
20;
生成ID
SELECT (instance_number +
100) ||
(
select
lpad(
mod(
sid,
1000),
3,
0)
from v$mystat
where
rownum =
1) ||
normal_seq.NEXTVAL
AS
ID
FROM v$
Instance;
输出
ID
-------------------
1015021
18c之后
创建自适应序列
CREATE
SEQUENCE scale_seq
START
WITH
1
INCREMENT
BY
1 MAXVALUE
1000000 SCALE;
获取下一个序列值
SELECT scale_seq.NEXTVAL
FROM dual;
输出
NEXTVAL
-------------------
1015021
这两个案例展示了在Oracle数据库中创建和使用序列的基本方法,包括传统序列和自适应序列的使用。自适应序列通过添加 SCALE关键字来创建。
LISTAGG聚合的DISTINCT选项
DB19c之前的方法
SELECT d.dname,
LISTAGG(e.job,
', ')
WITHIN
GROUP (
ORDER
BY e.job)
AS jobs
FROM (
SELECT
DISTINCT job
FROM scott.emp e
WHERE d.deptno = e.deptno) jobs,
scott.dept d
GROUP
BY d.dname;
DB19c及以后版本的方法
SELECT d.dname,
LISTAGG(
DISTINCT e.job,
', ')
WITHIN
GROUP (
ORDER
BY e.job)
AS jobs
FROM scott.dept d
JOIN scott.emp e
ON d.deptno = e.deptno
GROUP
BY d.dname;
Top-N查询处理
在数据库查询中,有时需要限制返回的行数,或者实现分页查询。Oracle数据库提供了多种方式来实现这一需求。
语法:
-
OFFSET:指定从结果集的第 offset+1个记录开始返回。 -
FETCH:指定返回行的个数或者返回行的百分比。 -
ROW | ROWS:与 OFFSET一起使用,表示行数。 -
FIRST | NEXT:与 FETCH一起使用,表示获取第一行或下一行。 -
PERCENT:与 FETCH一起使用,表示返回结果集的百分比。 -
ONLY:与 FETCH一起使用,指定返回明确的行数或百分比的行数。 -
WITH TIES:如果指定此子句,那么拥有和最后一行相同的排序键值的行也会被返回。必须与 ORDER BY一起使用。
SELECT e.email, j.job_title, e.salary
FROM emp e
JOIN job_titles j ON e.job_id = j.job_id
ORDER BY e.salary DESC
OFFSET 20 ROWS
FETCH FIRST 20 PERCENT ROWS ONLY;
近似函数在Top-N查询中的应用
在处理大规模数据集时,获取Top-N查询的精确结果可能非常耗时。Oracle数据库提供了一些近似函数,如
APPROX_COUNT(),
APPROX_SUM(), 和
APPROX_RANK(),这些函数能够在保证误差率低于0.5%的前提下,快速提供近似结果。
--使用APPROX_COUNT()函数来快速估算每个博客文章的浏览量
SELECT blog_post, APPROX_COUNT(*)
AS page_views
FROM weblog
GROUP
BY blog_post
FETCH
FIRST
5
ROWS
ONLY;
引用:《oracle DB19c开发必用新特性》
通过上述介绍,我们了解到Oracle 12c及后续版本中引入的多种新特性极大地提升了数据库的功能性和灵活性。不论是通过增加对象名称长度到128字节来提高描述性,还是通过扩展VARCHAR2等数据类型的大小至32767字节来更好地存储文本信息,亦或是利用新的自增ID列和自适应序列来优化数据加载过程,这些改进都反映了Oracle致力于提供更加现代化、用户友好的数据库解决方案的决心。此外,增强的聚合函数和Top-N查询功能使得复杂的数据分析任务变得更加直观和高效。对于任何寻求在Oracle平台上构建高性能应用的开发者来说,掌握这些新特性将是至关重要的一步。