我们在Oracle21c与您共同憧憬美好2021当中为大家介绍了Oracle Database 21c的新特性概要。从今天开始,我们将分几期内容,为大家具体介绍Oracle Database 21c的新特性。
如我们之前所说,目前Oracle Database 21c在Oracle公有云OCI当为大家提供。接下来我们就看看如何创建我们实验所使用的Oracle Database 21c环境。

与我们之前在云端创建数据库的方法一样,来到DB System,根据您的需要选择VM,BM或者Exadata作为基础环境,在今天的实验中,我们选择VM作为基础环境。

根据您的情况选择shape大小,建议使用4个OCPU及以上的环境,如果您使用的Oracle免费提供的测试账号,由于Policy的限制,选择2个OCPU也是可以的,环境启动之后大概使用65%的内存,standard2.2的环境带有2个OCPU和30GB内存,也是能够满足使用需求的。

给出SSH登录时需要的秘钥。

根据您的具体情况,选择软件许可类型。今天我们使用的是包含软件许可的Oracle Database 21c,如果您已经购买软件许可并想在云端使用它,可以选择后面的BYOL。

选择数据库版本为21c,给出管理密码。


经过一段时间的等待,可以通过SSH登录到主机,并使用SQL*Plus登录Oracle Database 21c。大家可以看到目前的版本是21.1.0.0.0。


实验1-1:新的set操作符
1、EXCEPT
Except是集合操作符,使用第一个查询结果中的unique记录减去Except操作符后面查询中unique的记录。
我们首先使用oe用户登录,查询inventories和order_items这两个table当中distinct product_id的数量。通过下方查询,可以看到一个是208一个是185。
SQL*Plus: Release 21.0.0.0.0 - Production on Sat Dec 26 04:54:08 2020Version 21.1.0.0.0Copyright (c) 1982, 2020, Oracle. All rights reserved.Last Successful login time: Sat Dec 26 2020 04:50:49 +00:00Connected to:Oracle Database 21c EE High Perf Release 21.0.0.0.0 - ProductionVersion 21.1.0.0.0SQL> SELECT count(distinct product_id) FROM inventories;COUNT(DISTINCTPRODUCT_ID)-------------------------208SQL> SELECT count(distinct product_id) FROM order_items;COUNT(DISTINCTPRODUCT_ID)-------------------------185
接下来我们想了解有多少种商品在库存中,但从未被订购,我们可以使用except来完成。这个操作首先找到inventories中unique的product_id,然后减去order_items中unique的product_id就得到了从未被订购过的商品product_id。
SQL> SELECT count(*) FROM (SELECT product_id FROM inventories EXCEPT SELECT product_id FROM order_items);COUNT(*)----------84
我们还想知道有多少种订购的产品现在在库存中缺失?也可以使用Except来查询。原理与上面相同。
SQL> SELECT count(*) FROM (SELECT product_id FROM order_items EXCEPT SELECT product_id FROM inventories);COUNT(*)----------61
2、EXCEPT ALL
我们可以对比上面的Except进行操作,我们将上面的Except语句换成Except All,返回的结果就不再是多少种,而是具体的产品ID了。所以大家使用ALL关键字的时候要注意。
SQL> SELECT count(*) FROM (SELECT product_id FROM inventories EXCEPT ALL SELECT product_id FROM order_items);COUNT(*)----------826SQL> SELECT product_id FROM inventories EXCEPT ALL SELECT product_id FROM order_items;PRODUCT_ID----------17331733173317331733173317331733173317341734PRODUCT_ID----------1734173417341734………………………………24532453PRODUCT_ID----------3225826 rows selected.
3、INTERSECT与INTERSECT ALL
INTERSECT这不算是一个新的操作符,我们将通过与下面的INTERSECT ALL对比为大家做实验。比如我们想知道有多少种商品已经被订购过,且在库存表中还有存货,可以继续被订购,使用INTERSECT的时候,会自动使用unique操作。所以得到的结果是多少种。使用了ALL之后,大家看到什么变化?
SQL> SELECT count(*) FROM (SELECT product_id FROM inventories INTERSECT SELECT product_id FROM order_items);COUNT(*)----------124SQL> SELECT count(*) FROM (SELECT product_id FROM order_items INTERSECT SELECT product_id FROM inventories);COUNT(*)----------124SQL> SELECT count(*) FROM (SELECT product_id FROM inventories INTERSECT ALL SELECT product_id FROM order_items);COUNT(*)----------286

实验1-2:在初始化参数中使用表达式
以前我们在设定初始化参数的时候,给出确切值,比如256GB,1800等等。在21c当中,在设定初始化参数的时候,可以使用表达式。我们拿sga_target为例。我们使用system用户登录CDB。
Connected to:Oracle Database 21c EE High Perf Release 21.0.0.0.0 - ProductionVersion 21.1.0.0.0SQL> show parameter sga;NAME TYPE VALUE------------------------------------ ----------- ------------------------------allow_group_access_to_sga boolean FALSElock_sga boolean FALSEpre_page_sga boolean TRUEsga_max_size big integer 29184Msga_min_size big integer 0sga_target big integer 29184M
大家可以看到,当前的sga_target与sga_max_size相同,我们现在要将sga_target设定为sga_max_size的80%。大家看到新的sga_target已经发生变化了。
SQL> ALTER SYSTEM SET sga_target = 'sga_max_size*80/100';System altered.SQL> show parameter sgaNAME TYPE VALUE------------------------------------ ----------- ------------------------------allow_group_access_to_sga boolean FALSElock_sga boolean FALSEpre_page_sga boolean TRUEsga_max_size big integer 29184Msga_min_size big integer 0sga_target big integer 23360MSQL>
这种设定可以实现连动,比如下面的例子,我们将job_queue_processes的值设定为processes的10%,当我们对processes进行修改的时候,job_queue_processes的值也会跟着发生改变。大家观察下面代码中的800与80。在设定的时候,还可以使用函数,比如在下面代码中,将AQ_TM_PROCESSES的值设定为40或者processes的10%,这两个值,哪个小,取哪个。
SQL> ALTER SYSTEM SET job_queue_processes='processes*10/100' SCOPE=BOTH;System altered.SQL> SHOW PARAMETER processesNAME TYPE VALUE------------------------------------ ----------- ------------------------------aq_tm_processes integer 1db_writer_processes integer 1gcs_server_processes integer 0global_txn_processes integer 1job_queue_processes integer 80log_archive_max_processes integer 4processes integer 800SQL>SQL> ALTER SYSTEM SET AQ_TM_PROCESSES = 'MIN(40, PROCESSES * .1)' SCOPE=BOTH;System altered.SQL> SHOW PARAMETER processesNAME TYPE VALUE------------------------------------ ----------- ------------------------------aq_tm_processes integer 40db_writer_processes integer 1gcs_server_processes integer 0global_txn_processes integer 1job_queue_processes integer 80log_archive_max_processes integer 4processes integer 800SQL>
接下来我们将processes的数值调整到1000,然后重启数据库,我们再观察job_queue_processes的数值是多少。大家看到processes的值已经变成1000,aq_tm_processes的值还是40,因为依旧满足上面设定的规则,而job_queue_processes已经变成100了。
SQL> ALTER SYSTEM SET PROCESSES = 1000 scope=spfile;System altered.Connected to:Oracle Database 21c EE High Perf Release 21.0.0.0.0 - ProductionVersion 21.1.0.0.0SQL> SHOW PARAMETER processesNAME TYPE VALUE------------------------------------ ----------- ------------------------------aq_tm_processes integer 40db_writer_processes integer 1gcs_server_processes integer 0global_txn_processes integer 1job_queue_processes integer 100log_archive_max_processes integer 4processes integer 1000SQL>
不只是数值可以这样设定,我们常用的路径也是可以使用表达式来完成的。比如在下面的例子当中,我们将db_recovery_file_dest的位置修改为$HOME,然后强制切换几次日志,于是我们就在/home/oracle下面找到了我们的归档日志。之后我们再将db_recovery_file_dest位置恢复为原来的位置。然后将sga_target也恢复为与sga_max_size相同的值,结束这个实验。
SQL> show parameter db_recovery_file_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_recovery_file_dest string u03/app/oracle/fast_recovery_areadb_recovery_file_dest_size big integer 250GSQL> ALTER SYSTEM SET db_recovery_file_dest='$HOME' SCOPE=BOTH;System altered.SQL> show parameter db_recovery_file_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_recovery_file_dest string $HOMEdb_recovery_file_dest_size big integer 250GSQL> ALTER SYSTEM SWITCH LOGFILE;System altered.SQL> ALTER SYSTEM SWITCH LOGFILE;System altered.SQL> ALTER SYSTEM SWITCH LOGFILE;System altered.SQL> ![oracle@henry M104783GC10]$ cd $HOME[oracle@henry ~]$ pwd/home/oracle[oracle@henry ~]$ lsCloud_21c_Labs_12_18_20.zip DB21C_ICN1B6 database5486768208058276315.rsp initparam2465599004943626903.rsp labs[oracle@henry ~]$ cd DB21C_ICN1B6/[oracle@henry DB21C_ICN1B6]$ lsarchivelog[oracle@henry DB21C_ICN1B6]$ cd archivelog/[oracle@henry archivelog]$ ls2020_12_26[oracle@henry archivelog]$ cd 2020_12_26/[oracle@henry 2020_12_26]$ lso1_mf_1_4_hyfmz3qh_.arc o1_mf_1_5_hyfmz5gx_.arc o1_mf_1_6_hyfmz8y7_.arc[oracle@henry 2020_12_26]$SQL> show parameter db_recovery_file_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_recovery_file_dest string u03/app/oracle/fast_recovery_areadb_recovery_file_dest_size big integer 250GSQL>SQL> alter system set sga_target=sga_max_size;System altered.
今天的内容就到这里,明天将为大家介绍Oracle Database 21c新特性:SQL宏、位聚合函数,期待您的关注,谢谢!
编辑:殷海英





