暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

性能飞跃:探索Oracle 12c至19c中提升应用效率的几大新特性

点击上方蓝字,关注我们


想学会更多实用技巧,欢迎加入青学会MOP技术社区(实名社区)。

加入方法:公众号后台回复关键字“加入”获取小助手微信,添加后登记入会。

同时欢迎大家在评论区留言互动交流!社区会不定期举行相关的抽奖、公开分享活动。

如果你有想了解的知识点希望我们发文可以后台私信。

正文开始

从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列的步骤:

  1. 创建以ID为主键的表:定义表结构并设置ID列为主键。
  2. 创建序列:用于生成唯一的自增数值。
  3. 创建触发器:在插入数据时自动填充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(idnameVALUES(1'wy');

以下是根据您提供的内容整理的文章部分,并对对象名称进行了修改:


Oracle数据库新特性:自适应序列(Scalable Sequence)

自适应序列是Oracle数据库引入的一项新特性,旨在解决在大规模数据加载过程中,由于序列生成主键而导致的序列和索引块争用问题。这在单实例或RAC(Real Application Clusters)数据库环境中尤为显著。通过减少这类争用,自适应序列能够提供更好的数据加载吞吐量。

自适应序列的工作原理

自适应序列通过在序列值上添加一个6位数字的前缀来实现其功能。这个前缀由两部分组成:

  1. 实例偏移量:由3位数字组成,计算方式为 (instance id % 100) + 100
  2. 会话偏移量:由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,0from 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平台上构建高性能应用的开发者来说,掌握这些新特性将是至关重要的一步。

如果你渴望获取更多关于数据库学习的干货内容,欢迎继续关注我们的“青年数据库学习互助会”公众号。我们将持续为你带来最新的技术资讯、实用技巧和深度教程,助力你在数据库领域取得更大的成就。




END

往期文章回顾

MOP社区新闻

  青学会MOP技术社区成立了!

  青学会专家顾问团成员介绍

金仓专栏

  告别繁琐!KingbaseES v9数据库一键安装-青学会&金仓专栏(1)

  KingbaseES v9数据库Docker安装-青学会&金仓专栏(2)

  KingbaseES数据脱敏-青学会&金仓专栏(3)

  KingbaseES后台服务管理-青学会&金仓专栏(4)

  电科金仓KES日常运维命令集锦-青学会&金仓专栏(5)

DBA实战小技巧

  推荐一款超实用的openGauss数据库安装工具!

  实战:记一次RAC故障排查
  DBA实战运维小技巧安装篇(一)Oracle 主流版本不同架构下的静默安装指南
  DBA实战运维小技巧存储篇(一)根目录满了如何处理
  DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储

MOP社区投稿-内核开发

  浅谈 PostgreSQL GUC 模块原理

  简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理

  简单讨论 PostgreSQL C语言拓展函数返回数据表的方式

  简单分析 pg_config 程序的作用与原理
  Redis 日志机制简介(一):SlowLog
  Redis 日志机制简介(二):AOF 日志
  Redis 日志机制简介(三):RDB 日志
  pg_cron插件使用介绍
  Redis 的指令表实现机制简介
  pg几款源码工具介绍
  Redis 事务功能简介

MOP顾问说

   MOP顾问说:MOP 三种主流数据库常用 SQL(一)

  MOP顾问说:服务器内存

  MOP 顾问说:Linux Nice 值与 CPU 优先级揭秘


文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论