技术开发 频道

Oracle 数据库12c 16大新特性总结

  10. 限制PGA的大小

  在Oracle 12c R1之前,没有选项可以用来限制和控制PGA的大小。虽然你设置某个大小为PGA_AGGREGATE_TARGET 的初始参数,Oracle会根据工作负载和需求来动态地增大或减小PGA的大小。而在12c中,你可以通过开启自动PGA管理来对PGA设定硬性限制,这需要对PGA_AGGREGATE_LIMIT 参数进行设置。因此,你现在可以通过设置新的参数来对PGA设定硬性限制以避免过度使用PGA。

SQL> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=2G;
SQL
> ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=0; --disables the hard limit

  重要提示:

  当超过了当前PGA的限制,Oracle会自动终止/中止会话或进程以保持最合适的PGA内存。

  11. 对表分区维护的增强

  在第一部分中,我解释了如何在线或是离线状态下迁移一个表分区或子分区到另一个不同的表空间。在本文中,主要介绍表分区其他方面的改进。

  添加多个新分区

  在Oracle 12c R1之前,一次只可能添加一个新分区到一个已存在的分区表。要添加一个以上的新分区,需要对每个新分区都单独执行一次ALTER TABLE ADD PARTITION语句。而Oracle 12c只需要使用一条单独的ALTER TABLE ADD PARTITION 命令就可以添加多个新分区,这增加了数据库灵活性。以下示例说明了如何添加多个新分区到已存在的分区表:

SQL> CREATE TABLE emp_part
(eno
number(8), ename varchar2(40), sal number (6))
PARTITION
BY RANGE (sal)
(PARTITION p1
VALUES LESS THAN (10000),
PARTITION p2
VALUES LESS THAN (20000),
PARTITION p3
VALUES LESS THAN (30000)
);
 

  添加两个新分区:

SQL> ALTER TABLE emp_part ADD PARTITION
PARTITION p4
VALUES LESS THAN (35000),
PARTITION p5
VALUES LESS THAN (40000);

  同样,只要MAXVALUE分区不存在,你就可以添加多个新分区到一个列表和系统分区表。

  如何删除和截断多个分区/子分区

  作为数据维护的一部分,DBA通常会在一个分区表上进行删除或截断分区的维护任务。在12c R1之前,对于一个已存在的分区表一次只可能删除或截断一个分区。而对于Oracle 12c, 可以用单条ALTER TABLE table_name {DROP|TRUNCATE} PARTITIONS 命令来撤销或合并多个分区和子分区。

  下例说明了如何在一个已存在分区表上删除或截断多个分区:

SQL> ALTER TABLE emp_part DROP PARTITIONS p4,p5;
SQL
> ALTER TABLE emp_part TRUNCATE PARTITONS p4,p5;

  要保持索引更新,使用UPDATE INDEXES或UPDATE GLOBAL INDEXES语句,如下所示:

SQL> ALTER TABLE emp_part DROP PARTITIONS p4,p5 UPDATE GLOBAL INDEXES;
SQL
> ALTER TABLE emp_part TRUNCATE PARTITIONS p4,p5 UPDATE GLOBAL INDEXES;

  如果你在不使用UPDATE GLOBAL INDEXES 语句的情况下删除或截断一个分区,你可以在USER_INDEXES或USER_IND_PARTITIONS 字典视图下查询ORPHANED_ENTRIES 字段以找出是否有索引包含任何的过期条目。

  将单个分区分割为多个新分区

  在12c中新增强的SPLIT PARTITION 语句可以让你只使用一个单独命令将一个特定分区或子分区分割为多个新分区。下例说明了如何将一个分区分割为多个新分区:

SQL> CREATE TABLE emp_part
(eno
number(8), ename varchar2(40), sal number (6))
PARTITION
BY RANGE (sal)
(PARTITION p1
VALUES LESS THAN (10000),
PARTITION p2
VALUES LESS THAN (20000),
PARTITION p_max (MAXVALUE)
);
SQL
> ALTER TABLE emp_part SPLIT PARTITION p_max INTO
(PARTITION p3
VALUES LESS THAN (25000),
PARTITION p4
VALUES LESS THAN (30000), PARTITION p_max);

  将多个分区合并为一个分区

  你可以使用单条ALTER TBALE MERGE PARTITIONS 语句将多个分区合并为一个单独分区:

SQL> CREATE TABLE emp_part
(eno
number(8), ename varchar2(40), sal number (6))
PARTITION
BY RANGE (sal)
(PARTITION p1
VALUES LESS THAN (10000),
PARTITION p2
VALUES LESS THAN (20000),
PARTITION p3
VALUES LESS THAN (30000),
PARTITION p4
VALUES LESS THAN (40000),
PARTITION p5
VALUES LESS THAN (50000),
PARTITION p_max (MAXVALUE)
);
SQL
> ALTER TABLE emp_part MERGE PARTITIONS p3,p4,p5 INTO PARTITION p_merge;

  如果分区范围形成序列,你可以使用如下示例:

SQL> ALTER TABLE emp_part MERGE PARTITIONS p3 TO p5 INTO PARTITION p_merge;
0
相关文章