当前位置: 首页 >> 技术文章 >> Oracle 19c和20c新特性最全解密
Oracle 19c和20c新特性最全解密
发布时间:2019-12-11 发布人:杨廷琨 263


本期为我们带来分享的嘉宾是 ACOUG 核心专家,Oracle ACE 总监 杨廷琨先生,本次嘉年华上,杨老师为我们带来题为:Oracle 19c 和 20c 的新特性解密 主题分享。下面,让我们跟随杨老师,一同来学习关于Oracle 19c和20c新特性吧~

微信图片_20191210094156.jpg


在这次数据技术嘉年华大会上,我和大家分享的是Oracle最新版本的一些重要的新特性。


根据我们白求恩自动巡检平台的数据分析结果,虽然Oracle对于11g的支持已经进入扩展维护期,但是目前业内使用最多的版本仍然是11.2,大概占到了6成左右。而12c的版本的使用超过10g版本,总体接近3成。这说明对于很多客户,已经逐渐把数据库升级到了12.2及以后的版本上。12c正在逐渐变为主流的版本,因此希望把新版本中一些重要的新特性分享给大家,以便于后续在数据库版本选择的时候可以对新的功能做到心中有数。


微信图片_20191210094207.jpg


12.2推出了很长时间了,大部分DBA对于12.2的特性并不陌生,因此这次主要分享18c、19c和20c的新特性。


微信图片_20191210094210.jpg


在Oracle中,一个频繁插入的系统在正常时刻的运行会非常稳定和高效,但是很可能突然会出现大量的竞争和等待,一般来说产生这个性能问题原因是单调递增索引在索引分裂的时候引发的竞争和等待。绝大部分主键依赖于SEQUENCE产生的NEXT_VALUE,而SEQUENCE产生的值一般都是单调递增的,因此序列产生的新值总是最大的,而索引本身又是一个排序的结构,当多个会话同时进行插入时,这些会话就会争抢索引叶子块的最右端,也就是最大值存放的地方。当索引需要进行分裂来扩展空间时,就会导致所有试图插入的会话被锁定,从而引发一系列并发等待,造成严重的性能问题。


在18c中,一个重要的特性就是引入了Scalable Sequence。Oracle改造了序列的构成,其后半部分就是一个标准的序列,而前半部分分别把数据库的实例ID和当前会话的SESSION ID加到了序列中,因此在获取序列的NEXT_VALUE时,得到的不再是递增的数值,而且变化差异非常大的不连续的数值,从根本上改变了获取序列的数据连续性问题,解决了由此引发的索引热点块争抢的问题。


微信图片_20191210094212.jpg


18c中使用外部表不再需要通过DDL先创建后使用的方式,可以将外部表的描述性部分直接加入到访问的SQL语句中,从而简化了外部表的使用和维护。尤其是针对一次性加载的外部表,INLINE外部表功能是非常方便的。


微信图片_20191210094215.jpg


除了增加了外部表使用的便利性,在性能方面,18c也对外部表进行了优化。可以在数据库中为外部表创建IN MEMORY缓存,从而极大的加快外部表数据的运算和分析过程,对于多次访问或进行复杂分析运算的外部表,启用IN MEMORY外部表功能,可能会得到成百倍的性能提升。


微信图片_20191210094217.jpg


Oracle对于PDB的复制同步功能得到进一步提升,从12.2引入了PDB的热克隆,同时支持了克隆库可以阶段性的从源库进行增量的数据同步,而在18c中,可以对源库和克隆库之间进行SWITCHOVER切换,转换二者的身份,使得源库变成可同步刷新的只读克隆环境,而原本的只读克隆库变为可读写的主库。这种PDB级别的SWITCHOVER对于计划停机场景和非计划故障停机场景都是有价值的。


微信图片_20191210094221.jpg


18c中另外一个很重要的特性就是Oracle提供了对于用户使用权限的捕获,可以通过开启一个业务周期的权限捕获,然后获取到这个用户在这个业务周期内,使用了哪些权限,访问了哪些对象,对于分析当前用户是否权限过大,非常有帮助。而在之前的版本中,这个任务非常难以实现。


上面是18c中带来的一些重要的特性,下面看看19c中Oracle又引入了哪些重大的功能和特性:


微信图片_20191210094224.jpg


Oracle第一次提出了自制数据库的概念,而要解决数据库自治,自动优化是不可缺少的,而19c引入的一个重要的特性就是索引自动创建功能。当设置了自动索引创建功能后,Oracle后台会不断的评估数据库中运行的SQL语句,分析这个语句是否可以通过创建索引来提升性能,并尝试创建不可见索引,如果优化器评估确认新创建的索引确实可以提高查询性能,会将这个索引设置为可见,使得前台业务SQL语句可以使用这个索引。


微信图片_20191210094227.jpg


针对物联网应用场景,面临海量数据的频繁插入,Oracle提供了专门的优化手段:MEMOPTIMIZE FOR WRITE。开启表的这个功能后,前台业务插入直接写入LARGE POOL中的内存空间,后台进程异步的将内存中的数据写入到数据库文件中,其本质是以牺牲事务性为代价来换取极速的插入性能,在2 Socket服务器上可以实现每秒插入2500万条记录。


微信图片_20191210094231.jpg


在19c中Oracle对于在线维护操作进一步增加,进一步降低了DDL对于正在运行系统的影响。在进行游标过期时,将会采用更加智能的策略,将DML和SELECT按照不同的策略进行处理,采用滚动游标过期方式,避免DDL使得所有相关游标同时过期,从而导致解析风暴引发的并发锁定问题。


微信图片_20191210094233.jpg


在数据库中有一类SQL比较难以处理,被称为RUNAWAY语句,这类语句有一个特点,执行次数并不频繁,但是会消耗大量的资源,一旦被执行就可能造成系统的性能问题。而且下次再运行的时候,可能在SQL文本上有少量的变化,导致难以通过SQL_ID的方式进行定位和处理。


Oracle针对这种SQL提供了执行计划隔离的能力,评估一个SQL是否会被隔离不是根据SQL文本,而是根据SQL的执行计划,一旦SQL的消耗超过了资源管理器中的阈值设置,该SQL语句对应的执行计划就被隔离起来,后续所有采用同样执行计划的SQL都不会再被执行。从而有效地避免了RUNAWAY语句对于性能的影响。


微信图片_20191210094235.jpg


19c的ADG对DML的自动重定向功能也是比较引人关注的,在配置了该功能后,在备库上运行的DML会被Oracle通过内部DBLINK传输到主库中运行,运行成功后产生的日志发送到备库并成功应用后,备库上的DML才会成功返回,并可以查看到DML执行后的结果。


Oracle实现这个功能的同时并没有牺牲数据库的事务性,也就是说在备库的DML未提交之前,备库上的修改只有当前会话可见,其他会话看不到修改后的结果,当备库的DML修改提交之后,其他会话才可以看到修改后的结果。这个功能适用于读写分离应用中存在很少量修改的情况,这时备库不会报错,而是透明的将修改应用到主库中。


微信图片_20191210094238.jpg


在19c中,对于Sharding的功能有了进一步的增强,其中比较重要的一点改进是目前Sharding支持多个表家族,也就是说一个Shard中可以存储超过一套的主子表,而在以前的版本中,Oracle只允许存储一套主子表。另外一个改进是在Sharding的目录库中,可以通过运行ALTER SYSTEM语句将参数设置发送到所有的Shard库中。


微信图片_20191210094240.jpg


Oracle在19c中对于外部数据的混合存储功能进一步加强,允许分区表中部分分区为数据库内的在线数据,部分分区由存储在外部文件系统的外部数据构成。这使得数据库中全生命周期管理功能得到进一步完善。对于很少访问的历史数据,不需要通过额外的历史库或历史表去访问,而是通过原表不需要修改程序就可以直接访问到离线的只读数据。Oracle会对不同类型的分区进行分别处理,当一个SQL同时访问内部分区和外部分区时,Oracle将执行计划拆分为两个UNION ALL分支,采用不同的执行计划去获取数据。


微信图片_20191210094244.jpg


很多时候一些SQL的执行计划性能低下,实际上是统计信息不准确导致的,Oracle的19c开始将部分关键统计信息实时化,从根本上避免了由于统计信息不准确导致执行计划低效的问题。由于统计的实时化不能以牺牲DML操作的性能为代价,因此目前实时计算的统计信息仅包括最小值,最大值和行数。因此实时统计信息并不能完全代替统计信息收集,后台的自动统计信息收集仍然需要执行。


微信图片_20191210094246.jpg


19c在SQL方面有三方面的增强,首先增加了一个ANY_VALUE()函数,这使得在聚集操作时,可以对非关键列采用随机值而不是必须使用MIN/MAX来进行处理,从而降低了处理的资源消耗;第二方面是字符串汇总功能LISTAGG增加了DISTINCT关键字,可以在汇总字符串之前去掉重复数据,从而降低了SQL语句的复杂度;第三方面可以在计算DISTINCT的使用采用BITMAP的方式,从而获取更好的性能。


上面介绍了18c和19c中,Oracle最新的一些功能和特性,下面我们看一下在20c中,Oracle会带来哪些新的功能:


微信图片_20191210094249.jpg


在20c中,Oracle支持原生的区块链表,这种表具备了区块链的特性,包括不可篡改,加密和可验证等,而且与分布式区块链相比更容易使用。


微信图片_20191210094252.jpg


在20c的一体机中,Oracle开始支持持久化内存。持久化内存的处理速度要比FLASH和SSD硬盘快不止一个数量级,加入了持久化内存后,在存储节点上,数据会分为冷、温和热三个区域,冷数据存储在硬盘中,温数据存储在FLASH CACHE中,而最热的数据放在持久化内存中。配合最新的100G以太网以及RoCE协议,使得IO响应延迟可以达到微秒级。


微信图片_20191210094255.jpg


在20c中允许把SQL函数定义为类似C或JAVA语句用的宏定义的方式,该函数可以在编译的时候进行宏展开,目前Oracle支持标量表达式和FROM语句中的TABLE表达式两种类型的宏。


微信图片_20191210094259.jpg


在20c中Oracle增加了两个新的聚集函数:偏度和坡度,用来描述数据分布的情况;支持了运算聚集操作;通过GROUPS语句来扩展窗口边界,使得分析函数的窗口功能进一步增强。


微信图片_20191210094301.jpg


20c中Oracle内置了机器学习算法,比如极限梯度提升树,MSET-SPRT等。此外,这些机器学习的算法支持多种语言的支持,比如SQL、Python和R语言。


微信图片_20191210094304.jpg


在之前的版本中,当多租户数据库所在实例出现故障后,这个多租户会在哪个幸存实例上启动,取决于服务漂移到哪个实例上,PDB的启动由服务来驱动。在20c中,面临同样的问题时,有了更多的选择,可以定义PDB的选择性和等级,事先定义好问题发生后,PDB会在哪个节点上启动,此外还可以根据各个节点的运行负载以及性能差异来动态评估。


微信图片_20191210094307.jpg


对于RAC而言,一旦发生节点关闭,数据库会进行资源的重组,这个过程会锁定全局资源目录,从而导致在线的操作受到短暂的影响。在20c中,对于计划内的停机,在关闭数据库之前,Oracle自动完成资源的分配,避免了其他实例的恢复操作,有效的降低了对整个系统的影响。


微信图片_20191210094310.jpg


Oracle的In-Memory功能仅需一个参数就可以实现全自动化的管理,不在需要管理员手工指定表的方式。内置的自动算法会根据表的访问频繁情况,自动决定加载表或从IN-Memory内存中驱除表,还会自动对较少访问的数据进行压缩。


微信图片_20191210094312.jpg


Oracle的In-Memory功能不仅仅针对结构化数据,对于空间数据库和全文数据库,同样可以采用In-Memory来进行加速,从而获得几倍或更高的性能提升。


微信图片_20191210094314.jpg


在12.2和18c中,Oracle实现了ADG切换之后的连接会话保持和Buffer Cache的保持功能,在20c中,Oracle可以实现ADG中Result Cache缓存的保持功能,普通用户将很难察觉到Data Guard主备切换带来的影响。