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

Oracle Database 21c新特性讲座(1)——新的set操作符、在初始化参数中使用表达式

甲骨文云技术 2020-12-27
1227

我们在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 2020
    Version 21.1.0.0.0

    Copyright (c) 1982, 2020, Oracle. All rights reserved.

    Last Successful login time: Sat Dec 26 2020 04:50:49 +00:00

    Connected to:
    Oracle Database 21c EE High Perf Release 21.0.0.0.0 - Production
    Version 21.1.0.0.0

    SQL> SELECT count(distinct product_id) FROM inventories;

    COUNT(DISTINCTPRODUCT_ID)
    -------------------------
    208

    SQL> 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(*)
          ----------
          826
          SQL> SELECT product_id FROM inventories EXCEPT ALL SELECT product_id FROM order_items;

          PRODUCT_ID
          ----------
          1733
          1733
          1733
          1733
          1733
          1733
          1733
          1733
          1733
          1734
          1734

          PRODUCT_ID
          ----------
          1734
          1734
          1734
          1734
          ………………………………

          2453
          2453

          PRODUCT_ID
          ----------
          3225

          826 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(*)
            ----------
                   124
            SQL> SELECT count(*) FROM (SELECT product_id FROM order_items INTERSECT SELECT product_id FROM inventories);

            COUNT(*)
            ----------
                   124
            SQL> 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 - Production
              Version 21.1.0.0.0

              SQL> show parameter sga;

              NAME TYPE VALUE
              ------------------------------------ ----------- ------------------------------
              allow_group_access_to_sga boolean FALSE
              lock_sga boolean FALSE
              pre_page_sga boolean TRUE
              sga_max_size big integer 29184M
              sga_min_size big integer 0
              sga_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 sga

                NAME TYPE VALUE
                ------------------------------------ ----------- ------------------------------
                allow_group_access_to_sga boolean FALSE
                lock_sga boolean FALSE
                pre_page_sga boolean TRUE
                sga_max_size big integer 29184M
                sga_min_size big integer 0
                sga_target big integer 23360M
                SQL>

                这种设定可以实现连动,比如下面的例子,我们将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 processes

                  NAME TYPE VALUE
                  ------------------------------------ ----------- ------------------------------
                  aq_tm_processes integer 1
                  db_writer_processes integer 1
                  gcs_server_processes integer 0
                  global_txn_processes integer 1
                  job_queue_processes integer 80
                  log_archive_max_processes integer 4
                  processes integer 800
                  SQL>

                  SQL> ALTER SYSTEM SET AQ_TM_PROCESSES = 'MIN(40, PROCESSES * .1)' SCOPE=BOTH;

                  System altered.

                  SQL> SHOW PARAMETER processes

                  NAME TYPE VALUE
                  ------------------------------------ ----------- ------------------------------
                  aq_tm_processes integer 40
                  db_writer_processes integer 1
                  gcs_server_processes integer 0
                  global_txn_processes integer 1
                  job_queue_processes integer 80
                  log_archive_max_processes integer 4
                  processes integer 800
                  SQL>

                  接下来我们将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 - Production
                    Version 21.1.0.0.0

                    SQL> SHOW PARAMETER processes

                    NAME TYPE VALUE
                    ------------------------------------ ----------- ------------------------------
                    aq_tm_processes integer 40
                    db_writer_processes integer 1
                    gcs_server_processes integer 0
                    global_txn_processes integer 1
                    job_queue_processes integer 100
                    log_archive_max_processes integer 4
                    processes integer 1000
                    SQL>

                    不只是数值可以这样设定,我们常用的路径也是可以使用表达式来完成的。比如在下面的例子当中,我们将db_recovery_file_dest的位置修改为$HOME,然后强制切换几次日志,于是我们就在/home/oracle下面找到了我们的归档日志。之后我们再将db_recovery_file_dest位置恢复为原来的位置。然后将sga_target也恢复为与sga_max_size相同的值,结束这个实验。

                      SQL> show parameter db_recovery_file_dest

                      NAME TYPE VALUE
                      ------------------------------------ ----------- ------------------------------
                      db_recovery_file_dest string u03/app/oracle/fast_recovery_
                      area
                      db_recovery_file_dest_size big integer 250G
                      SQL> ALTER SYSTEM SET db_recovery_file_dest='$HOME' SCOPE=BOTH;

                      System altered.

                      SQL> show parameter db_recovery_file_dest

                      NAME TYPE VALUE
                      ------------------------------------ ----------- ------------------------------
                      db_recovery_file_dest string $HOME
                      db_recovery_file_dest_size big integer 250G
                      SQL> 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 ~]$ ls
                      Cloud_21c_Labs_12_18_20.zip DB21C_ICN1B6 database5486768208058276315.rsp initparam2465599004943626903.rsp labs
                      [oracle@henry ~]$ cd DB21C_ICN1B6/
                      [oracle@henry DB21C_ICN1B6]$ ls
                      archivelog
                      [oracle@henry DB21C_ICN1B6]$ cd archivelog/
                      [oracle@henry archivelog]$ ls
                      2020_12_26
                      [oracle@henry archivelog]$ cd 2020_12_26/
                      [oracle@henry 2020_12_26]$ ls
                      o1_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_dest

                      NAME TYPE VALUE
                      ------------------------------------ ----------- ------------------------------
                      db_recovery_file_dest string u03/app/oracle/fast_recovery_
                      area
                      db_recovery_file_dest_size big integer 250G
                      SQL>
                      SQL> alter system set sga_target=sga_max_size;

                      System altered.

                      今天的内容就到这里,明天将为大家介绍Oracle Database 21c新特性:SQL宏、位聚合函数,期待您的关注,谢谢!

                      编辑:殷海英



                      最后修改时间:2020-12-28 15:16:54
                      文章转载自甲骨文云技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论