数据仓库从oracle11G 升级到 oracle19C,新特性一览。
1. Invisible columns
create table emp (id number,name varchar2(20) invisible);
2. Multiple indexes on the same set of columns
create table dup(name varchar2(10),sex varchar2(10),adr varchar2(200),id number(10),birth date);
create index idx_dup_adr on dup(adr);
create bitmap index bitidx_dup_adr on dup(adr) invisible;
如果要使bitmap索引生效,将btree索引设为隐藏即可。
alter index idx_dup_adr invisible;
alter index bitidx_dup_adr visible;
3.Datadump的增强
关闭redo日志的生成,在导入大型表时可以通过增加TRANSFORM选项,关闭redo日志的生成,从而加快导入。
impdp admin/oracle@pdb directory=dump dumpfile=admin.dmp logfile=admin_nolog.log schemas=admin TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y
4.扩展数据类型长度32k Strings
VARCHAR2, NAVARCHAR2 以及 RAW 这些数据类型的 大小可以从 4K 以及 2K 字节扩展至32K 字节
5.在SQL语句中通过with语句定义函数
with function Is_Number
(x in varchar2) return varchar2 is
Plsql_Num_Error exception;
pragma exception_init(Plsql_Num_Error, -06502);
begin
if (To_Number(x) is NOT null) then
return 'Y';
else
return '';
end if;
exception
when Plsql_Num_Error then
return 'N';
end Is_Number;
select is_number('1') from dual;
6.高级索引压缩
在使用高级索引压缩之后,可以一定程度下降低数据库IO。
7.RMAN表级恢复总结:
1、12c的RMAN表级恢复可以恢复到被删除之前的任意时间点。假设表T1在drop之前,执行了truncate操作,表删除之后,可以恢复到truncate之前,其他表数据无影响。
2、表级恢复只能用cdb RMAN备份。
3、恢复期间会自动创建辅助实例,会还原system,sysaux,undo表空间,恢复目录需要有充足空间,最后通过数据泵把数据导入到原数据库。
8. 表分区或子分区的在线迁移
在Oracle12.2版本之前,如果想把一个非分区表转为分区表常用的有这几种方法:1、建好分区表然后insert into select 把数据插入到分区表中;2、使用在线重定义(DBMS_REDEFINITION)的方法。
在Oracle 12c R1中迁移表分区或子分区到不同的表空间不再需要复杂的过程。与之前版本中未分区表进行在线迁移类似,表分区或子分区可以在线或是离线迁移至一个不同的表空间。当指定了ONLINE语句,所有的DML操作可以在没有任何中断的情况下,在参与这一过程的分区或子分区上执行。与此相反,分区或子分区迁移如果是在离线情况下进行的,DML操作是不被允许的。
Oracle12cR2版本中提供了一种新特性,一条语句就可以把非分区表转换为分区表。
alter table emp modify
partition by range (deptno) interval (10)
(partition p1 values less than (10),
partition p2 values less than (20)) online update indexes (idx_emp_no local)
9.对表分区维护的增强
Oracle 12c只需要使用一条单独的:ALTER TABLE ADD PARTITION 命令就可以添加多个新分区
添加两个新分区:
ALTER TABLE emp_part ADD PARTITION p4 VALUES LESS THAN (35000),PARTITION p5 VALUES LESS THAN (40000);
要保持索引更新,使用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 字段以找出是否有索引包含任何的过期条目。
将多个分区合并为一个分区
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;