eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

May 9, 2020

Oracle 20c 新特性:XGBoost 机器学习算法和 AutoML 的支持

Oracle 20c数据库中引入的一个新的机器学习算法叫做XGBoost。XGBoost是一个开源软件库,它在大多数常用的数据科学、机器学习和软件开发语言中提供了一个梯度提升框架。

该算法是在之前的决策树、Bagging、随机森林、Boosting和梯度提升等工作的基础上发展而来。XGBoost 是一个高效、可扩展的机器学习算法,经过多年的研究、开发和验证,XGBoost可以用于分类的典型用例,包括分类、回归和排名问题(regression and classification)。

OML4SQL XGBoost (Oracle Machine Learning for SQL XGBoost) 是一个可扩展的梯度树提升系统,支持分类和回归。它提供了开源的梯度提升框架。通过准备训练数据,调用XGBoost,构建和持久化模型,并应用该模型进行预测,使得XGBoost Gradient Boosting开源包在数据库中可用。
PIC 4.jpg

你可以将XGBoost作为一个独立的预测器使用,也可以将其整合到实际的生产流水线中,用于广告点击率预测、危害风险预测、网页文本分类等多种问题。

OML4SQL XGBoost算法需要三种类型的参数:通用参数、助推器参数、任务参数。用户通过模型设置表来设置参数。该算法支持大部分开源项目的设置。

通过XGBoost,OML4SQL支持多种不同的分类和回归规范、排名模型和生存模型。在分类机器学习函数下支持二进制和多类模型,而在回归机器学习函数下支持回归、排名、计数和存活模型。

为什么 XGBoost 如此受到欢迎?
XGBoost 是基于决策树的集成机器学习算法,它以梯度提升(Gradient Boost)为框架。在非结构数据(图像、文本等)的预测问题中,人工神经网络的表现要优于其他算法或框架。但在处理中小型结构数据或表格数据时,现在普遍认为基于决策树的算法是最好的。下图列出了近年来基于树的算法的演变过程:
image.png

XGBoost 算法最初是华盛顿大学的一个研究项目。陈天奇和 Carlos Guestrin 在 SIGKDD 2016 大会上发表的论文《XGBoost: A Scalable Tree Boosting System》在整个机器学习领域引起轰动。自发表以来,该算法不仅多次赢得 Kaggle 竞赛,还应用在多个前沿工业应用中,并推动其发展。许多数据科学家合作参与了 XGBoost 开源项目,GitHub 上的这一项目约有 350 个贡献者,以及 3600 多条提交。和其他算法相比,XGBoost 算法的不同之处有以下几点:

  1. 应用范围广泛:该算法可以解决回归、分类、排序以及用户自定义的预测问题;
  2. 可移植性:该算法可以在 Windows、Linux 和 OS X 上流畅地运行;
  3. 语言:支持包括 C++、Python、R、Java、Scala 和 Julia 在内的几乎所有主流编程语言;
  4. 云集成:支持 AWS、Azure 和 Yarn 集群,也可以很好地配合 Flink、 Spark 等其他生态系统。

算法演进过程:

  1. 常规的机器学习模型(例如决策树)仅使用训练数据集来训练单个模型,并且仅将此模型用于预测。尽管决策树的创建非常简单(并且非常快),具有模型可解释性,但其预测能力可能不如大多数其他算法好。
  2. 为了克服此限制,可以使用集成方法创建多个决策树,并将其组合以用于预测目的。
  3. Bagging算法(英语:Bootstrap aggregating,引导聚集算法,又称装袋算法)是一种使用多数表决将来自多个DT模型的预测进行合并的方法。
  4. 在装袋方法的基础上,Random Forest使用功能的不同子集和训练数据的子集,以不同的方式将它们组合以创建DT模型的集合,并作为一个模型呈现给用户。
  5. Boosting通过建立顺序模型与每个后续模型的方式,采用一种更迭代的方法来完善模型,其重点是最大程度地减少先前模型的误差。
  6. 梯度提升使用梯度下降算法来最小化后续模型中的误差。
  7. 借助XGBoost,可以在上述步骤的基础上进行并行处理,树修剪,数据丢失处理,正则化以及实现更好的缓存,内存和硬件优化。通常称为梯度增强。

通过以下几个示意图,我们可以大致了解一下以上提到的各种 ML 算法。

  1. 决策树,以非常快速的、可解释的模型,来进行判断选择,支持决策
    image.png

  2. 多决策树,用于组合预测,增加准确性
    image.png

  3. Bagging 算法,也就是所谓的 装袋算法
    image.png
    Bagging 特点在"随机采样"。随机采样(bootsrap)就是从训练集采集固定个数的样本,但是每采集一个样本后,都将样本放回。也就是说,之前采集到的样本在放回后有可能继续被采集到。

  4. Random Forest ,随机森林 算法
    RF在实际中使用非常频繁,其本质上和bagging并无不同,只是RF更具体一些。一般而言可以将RF理解为bagging和DT(CART)的结合。随机森林是由很多决策树构成的,不同决策树之间没有关联。
    image.png

RF中的基学习器使用的是CART树,由于算法本身能降低方差(variance),所以会选择完全生长的CART树。抽样方法使用bootstrap,除此之外,RF认为随机程度越高,算法的效果越好。所以RF中还经常随机选取样本的特征属性、甚至于将样本的特征属性通过映射矩阵映射到随机的子空间来增大子模型的随机性、多样性。RF预测的结果为子树结果的平均值。RF具有很好的降噪性,相比单棵的CART树,RF模型边界更加平滑,置信区间也比较大。一般而言,RF中,树越多模型越稳定。
image.png

  1. Boosting
    Boosting 和 bagging 最本质的差别在于他对基础模型不是一致对待的,而是经过不停的考验和筛选来挑选出「精英」,然后给精英更多的投票权,表现不好的基础模型则给较少的投票权,然后综合所有人的投票得到最终结果。大部分情况下,经过 boosting 得到的结果偏差(bias)更小。
    image.png

  2. 梯度提升树算法
    梯度提升树算法实际上是提升算法的扩展版,在原始的提升算法中,如果损失函数为平方损失或指数损失,求解损失函数的最小值问题会非常简单,但如果损失函数为更一般的函数(如绝对值损失函数或Huber损失函数等),目标值的求解就会相对复杂很多。

梯度提升算法,是在第

Posted by eygle at 3:53 PM | Permalink | Oracle12c/11g (170)

May 6, 2020

Oracle 20c 新特性:expdp / impdp 数据泵EXCLUDE和CHECKSUM

随着 Oracle 的数据泵技术不断增强,这个逻辑数据备份和迁移工具,已经成为了 Oracle 数据库用户的首选工具之一,在 20c 中, expdp / impdp 都获得了大量的特性增强。
PIC 9.jpg

  • Oracle Data Pump 20c 可以在同一导出或导入操作中包含和排除对象,这意味着,DataPump 可以在同一操作中包含 INCLUDE 和 EXCLUDE 参数。通过对要迁移的对象进行更多的特定化,这一增强功能使迁移 Oracle 数据库更容易。

注意:在命令中包含两个参数时,Oracle 将首先处理 INCLUDE 参数,并包含由该参数标识的所有对象。然后处理 EXCLUDE 参数,从包含的对象集中删除被排除的对象。

下面是一个只包含2个表,但排除了包含 IDX 字样全部索引的例子:

expdp eygle SCHEMAS=eygle DUMPFILE=eygle.dmp REUSE_DUMPFILES=YES 
INCLUDE=TABLE:\"IN \(\'ENMO\',\'TECH\'\)\" 
EXCLUDE=INDEX:\"LIKE \'IDX\%\'\"
  • Oracle Data Pump 20c 可以重启中断的(resume)可传输的表空间导出和导入作业。支持对可传输表空间(TTS)元数据的并行导出和导入操作。

  • Oracle Data Pump 20c支持在导入时可选择索引压缩,包括对Oracle自治数据库的索引压缩。支持添加、更改和消除表压缩功能,数据泵也支持导入时索引压缩,引入了一个新的TRANSFORM参数子句INDEX_COMPRESSION_CLAUSE,从而支持索引压缩。

  • Oracle Data Pump 20c可以从Oracle自治数据库中执行导出到云对象存储中的转储文件。

  • 从Oracle数据库20c开始,现在在dumpfile中添加了一个校验和,你可以使用校验和来帮助确认文件是有效的。校验通过 CHECKSUM=[YES|NO] 参数控制。20c 支持多种校验算法 CHECKSUM_ALGORITHM = [CRC32|SHA256|SHA384|SHA512],缺省的算法是 SHA256 。

Checksum 的使用:

expdp hr DIRECTORY=dpump_dir1 DUMPFILE=hr.dmp CHECKSUM_ALGORITHM=SHA384

当导入时,可以通过 VERIFY_CHECKSUM=[YES|NO] 进行校验:

impdp hr DIRECTORY=dpump_dir1 DUMPFILE=hr.dmp VERIFY_CHECKSUM=YES

通过 impdp 还可以 VERIFY_ONLY=[YES|NO] 设置仅仅验证而不执行真正的数据导入操作。

参考链接:Oracle Data Pump

Posted by eygle at 10:07 AM | Permalink | Oracle12c/11g (170)

May 2, 2020

Oracle 20c 新特性:基础级内存数据库免费 In-Memory Base Level

In-Memory 作为一个选件,是 Oracle 在 12.1.0.2 中引入的一个特性,通过对数据进行列式存储,以加速查询分析的性能。通过这个特性,Oracle 数据库让行存和列存同时存在。

然而这是一个收费的功能,很多用户无法使用。在 20c 中,Oracle 增加了一个基础级的 In-Memory 选项,可以让用户在 16GB 以内,免费使用 In-Memory 的特性。

PIC 1.jpg

与此相关的几个条件:

  1. 在表或物化视图被填充到IM列存储中之前,需要先启用 IM 列存储。
  2. 在CDB下设置 INMEMORY_SIZE 决定了列存储的总体大小。默认情况下所有的PDB都可以访问IM列存储。
  3. 对于选择基础级用户,CDB层的 INMEMORY_SIZE 大小必须 < = 16G。

如果我们在全局启用,可以设置:

ALTER SYSTEM SET INMEMORY_SIZE = 16G SCOPE=SPFILE;

In-Memory Base Level 设置 INMEMORY_FORCE 初始化参数为 BASE_LEVEL :

ALTER SYSTEM SET INMEMORY_FORCE=BASE_LEVEL SCOPE=SPFILE;

以下示例,当启动数据库之后,In-Memory Area 分配,即表示启用了 In-Memory 选项功能:

SQL> ALTER SYSTEM SET INMEMORY_SIZE=10G SCOPE=SPFILE;
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP
Total System Global Area   11525947392 bytes
Fixed Size                     8213456 bytes
Variable Size                754977840 bytes
Database Buffers              16777216 bytes
Redo Buffers                   8560640 bytes
In-Memory Area             10737418240 bytes
Database mounted.
Database opened.

注意:在单个PDB中,可以将INMEMORY_SIZE设置为不同值来限制对共享In-Memory的访问。

例如,在一个有100个PDB的CDB中,你可以在CDB级别将INMEMORY_SIZE设置为16G,然后在一个PDB中将INMEMORY_SIZE设置为10G,在第二个PDB中设置为6G,在其余的PDB中设置为0。

参考:In-Memory Base Level

Posted by eygle at 10:13 AM | Permalink | Oracle12c/11g (170)

April 30, 2020

Oracle 20c 新特性: Persistent Memory Database 持久化内存数据库

随着硬件技术的不断进步,PMEM (Persistent Memory)已经足够成熟,开始进入到数据库加速领域,在 DRAM 和 Flash 之间提供能更强的 IO 层支撑。自 Oracle 20c 开始,持久化内存 PMEM(Persistent Memory )被引入到 Oracle 数据库中。
image.png

随着这一特性的引入,持久内存数据库功能(Persistent Memory Database)可以将数据库文件放置在非易失性内存中。 目前,PMEM 技术除了在Oracle的一体机之上,还支持PMEM Filestore上的单实例Oracle数据库

而从性能上看,Exadata 上的 PMEMCache 则比 Flash Cache 提升 3倍 以上的 IOPS,同时响应时间获得10倍以上的加速:
PIC 10.jpg

随之启用的还有直接映射缓冲区( Directly Mapped Buffer Cache ):
直接映射缓冲区缓存是Oracle数据库中的一种机制,可以绕过传统的DRAM Buffer Cache,直接读取持久性存储器上的数据。该机制还可以跟踪数据访问,并自动将频繁读取的数据、更新的数据从PMEM中自动带入DRAM Buffer Cache,以达到更快的访问速度。当数据文件被放置在PMEM文件存储中时,直接映射的缓冲区缓存机制会自动启用。

这一特性的启用,可以通过设置 PMEM_FILESTORE 参数实现:

  1. PMEM_FILESTORE 初始化参数,指定了Oracle数据库实例启动时将自动挂载的PMEM文件存储。该参数被设置为一对有序的字符串,参数值列表中的第一个字符串是PMEM Filestore挂载的目录。第二个字符串是 backing file 。
  2. PMEM Filestore 的 backing file 在OS文件系统层次结构中作为一个文件可见,从PMEM DAX的原生操作系统文件中获取存储。在Linux系统中,PMEM Filestore 的 Backing file 应该是在XFS或ext4文件系统中,使用-o dax选项挂载。

PIC 9.jpg

设置范例如下:

PMEM_FILESTORE=('/var/db/db_1', '/var/db_storage/db1.f') 
PMEM_FILESTORE=('/var/db/db_1', '/var/db_storage/db1.f', '/var/db/db_2', '/var/db_storage/db2.f')

相关的技术要点包括:

  1. PMEM Filestore是一个指针切换(Pointer-Switching)PMEM文件系统,支持数据块的原子更新。 PMEM Filestore是用于持久内存数据库的基础文件存储,提供外部接口用于直接在持久性内存中映射和访问数据库。
  2. 在PMEM Filestore上管理Oracle类似于在本机文件系统上管理,PMEM Filestore实现了用户空间文件系统(FUSE)协议,使Oracle DBA可以执行常规的文件级维护,FUSE允许非特权(非root)用户创建和管理文件系统以及其中包含的目录和文件
  3. 典型的文件系统使用 Raw Storage 作为其后备存储,而PMEM Filestore从PMEM DAX文件系统中的本机操作系统文件获取存储,该文件称为 Backing file,在操作系统中显示为文件。
  4. 创建并挂载PMEM文件存储后,可以在用户指定的挂载点下看到本地文件系统。此本地文件系统支持目录和常见的操作系统命令,例如ls和cp。此本地文件系统是PMEM文件存储,可用于存储Oracle数据库文件。请注意,只有在启动Oracle数据库实例时,PMEM文件存储才可见。
  5. 您可以将PMEM Filestore用于数据库数据文件和控制文件。出于性能原因,Oracle建议您将重做日志文件作为独立文件存储在可识别DAX的文件系统(例如EXT4 / XFS)中。诸如跟踪文件和审核文件之类的管理文件无法存储在PMEM Filestore中。因为可以在SPFILE中指定PMEM Filestore配置参数,SPFILE 无法存储在PMEM Filestore中。

其实关于 DAX 的优化,在 Oracle 18c 中就已经流露出来,如果你留意过,告警日志中记录了这样的新记录:

Redo log for group 1, sequence 1 is not located on DAX storage

Redo log for group 3, sequence 12 is not located on DAX storage

也就是数据库检查,Redo 日志没有位于 DAX 存储设备,也就是说,Oracle 支持将 Redo 放置于 Direct Access Storage (DAX) 上,更好的支持 PMEM 等高速存储设备。

初始化参数中, _simulate_dax_storage 可以用于模拟 DAX 存储:

SQL> select ksppinm,ksppdesc from x$ksppi where ksppinm like '%dax%';

KSPPINM

--------------------------------------------------------------------------------

KSPPDESC

----------------------------------------------------------------------------------

_simulate_dax_storage

Simulate log on DAX storage

在 20c 则是增加了一个参数:
_force_dax_io_err 其含义为 Force I/O error on online/standby redo log

下图展示了,当 PMEM 引入到数据库的IO栈,通过绕过软件Stack的昂贵内容切换,将会获得的 10倍以上性能提升:
PIC.jpg

如同前面展示的图示,为什么PMEM和Flash有这么大的区别呢?
PMEM 绝不仅仅是闪存面前的简单缓存,它依赖于专用的内存DIMM(Intel Optane)和特定的协议和通道(RDMA,和RoCE)。在使用闪存时,所有的I/O都需要传递到存储服务器栈和数据库服务器的内核部分,这意味着延迟。而在新的技术下,可以直接将数据库与存储服务器的PMEM内存连接起来,从而使得所需要的CPU减少,加快了响应。

在数据库的世界里,随着 PMEM 的加入,一切变得更加生动起来。

Posted by eygle at 10:41 AM | Permalink | Oracle12c/11g (170)

April 28, 2020

Oracle 20c 新特性:快速过滤的自动区域图-Automatic Zone Maps

Zone Maps 是一个独立的访问结构,可以为表独立建立。在表和索引扫描期间,区块图可以根据表列上的谓词来修剪表的磁盘块和分区表的潜在完整分区。区块映射可以使用 Attribute Clustering,也可以不使用属性聚类。

Zone map 特性最早是在 Exadata 上的特性功能,后来下放到企业版本中。

如下图所示:

  1. 为分区表创建分区图。对于五个分区中的每一个区域,区域图将存储跟踪列的最小值和最大值。
  2. 如果某个区段的存储列的最小值和最大值在查询谓词之外,那么这个区段不需要读取。
    • 例如,如果区块Z4跟踪的列prod_id的最小值为10,最大值为100;
    • 那么在这个区块中,predicate 谓词 prod_id = 200永远不会有任何匹配的记录,因此区块Z4将不会被读取
  3. 对于分区表,修剪可以在 分区 或 Zone 层面上进行。

PIC 5.jpg

在 Oracle 20c 中增加的特性是,自动化的 Zone Map:

  1. Automatic Zone Maps - 可以在没有任何客户干预的情况下为任何用户表创建和维护。
  2. 区域图允许根据查询中的谓词对块和分区进行修剪,无需任何用户干预。
  3. Automatic Zone Maps 对直接加载有效,并在后台对任何其他DML操作进行增量和周期性的维护和刷新。
  4. 自动区块图在不需要任何用户操作的情况下,透明地自动提高了查询的性能。
  5. 不可用场景: join zone maps, IOTs (Oracle Index-organized Tables ), external tables,temporary tables.
  6. Automatic zone map 缺省是关闭的(仅对 Oracle 一体机有效)

最后一条是遗憾,如果没有 Exadata 一体机,很多特性等同于乌有。

以下展示一个基本区域图创建和使用的示例

假设销售的查询经常指定客户ID或客户ID和产品ID的组合。您可以创建一个属性分类表,这样查询就可以从使用区域图的修剪中受益。你可以创建一个表,方法如下。

CREATE TABLE sales (
   prod_id NUMBER NOT NULL,
   cust_id NUMBER NOT NULL,
   time_id        DATE NOT NULL,
   channel_id     NUMBER NOT NULL,
   promo_id       NUMBER NOT NULL,
   quantity_sold  NUMBER(10,2),
   amount_sold NUMBER(10,2)
)
CLUSTERING
BY LINEAR ORDER (cust_id, prod_id)
YES ON LOAD YES ON DATA MOVEMENT
WITH MATERIALIZED ZONEMAP;

列(cust_id、prod_id)上的分区地图 ZMAP_SALES 被创建。这里,ZMAP_SALES是Oracle数据库自动生成的分区地图的名称。可以通过在 WITH MATERIALIZED ZONEMAP 后面的括号中为区块图指定一个名称。

对于同时限定了cust_id和prod_id或前缀cust_id的查询,会进行自然修剪。下面的例子显示了数据库在表扫描过程中如何进行修剪。

一个应用程序发出下面的查询。

SELECT * FROM sales WHERE cust_id = 100;

由于该表是BY LINEAR ORDER集群,所以数据库必须只读取包含cust_id值为100的区域。

一个应用程序发出下面的查询。

SELECT * FROM sales WHERE cust_id = 100 AND prod_id = 2300;

因为该表是BY LINEAR ORDER集群,所以数据库必须只读取包含cust_id值为100和prod_id为2300的区域。

参考链接:Using Zone Maps

Posted by eygle at 10:39 AM | Permalink | Oracle12c/11g (170)

近期发表

  • Oracle 20c 新特性:通过DIAGNOSTICS_CONTROL对诊断事件管控 - April 26, 2020
  • Oracle 20c 新特性:表达式参数值 Expressions Parameter Values - April 24, 2020
  • Oracle 20c 新特性: EXCEPT 运算符和ANSI SQL 全支持 - April 22, 2020
  • Oracle 20c 新特性:表空间缺省加密算法的增强 - April 21, 2020
  • Oracle 20c 新特性:原生的区块链表支持(Blockchain Table) - February 16, 2020
  • Oracle Database 20c 云上首发 官方文档全线提供下载 - February 15, 2020
  • 2020从新开始:Oracle DBA 必备技能和学习索引 - February 12, 2020
  • GaussDB T / A : 从 100 到 200 和 300 命名的变迁 - December 8, 2019
  • GaussDB T : 100 的多线程模式及后台线程介绍 - December 6, 2019
  • GaussDB 100: 用户权限以及修改 SYS 用户的缺省口令 - December 5, 2019


  • CopyRight © 2004 ~ 2012 eygle.com, All rights reserved.