12.1 Release
Asynchronous Global Index Maintenance for DROP and TRUNCATE Partition
drop及truncate分区时支持异步全局索引维护
之前drop或truncate分区时,会使全局索引不可用,update indexes和update global indexes虽然可以维护索引的可用性,但是索引的维护是立刻发生的,业务高峰时刻会影响性能。
12.1支持全局索引维护与DROP和TRUNCATE分区维护操作分离,而不会使全局索引不可用。索引维护是异步完成的,可以延迟到稍后的时间点。在不影响索引可用性的情况下,将全局索引维护延迟到非高峰时间,在分区维护操作的时间点上降低和截断分区和子分区维护操作的速度更快,资源更少。当与更新索引子句相结合时,DROP分区和TRUNCATE分区命令将导致元数据索引维护。
此功能仅用于堆表,不支持对象类型、域索引或由SYS拥有的表。
实际的索引维护是在稍后的时间执行的,由以下之一触发:
- SYS.PMO_DEFERRED_GIDX_MAINT_JOB作业预定在每天02:00运行。
- SYS.PMO_DEFERRED_GIDX_MAINT_JOB作业手动运行
- DBMS_SCHEDULER.RUN_JOB存储过程。
- 运行DBMS_PART.CLEANUP_GIDX存储过程。
- 运行ALTER INDEX REBUILD [PARTITION]]命令。
- 运行ALTER INDEX [PARTITION] COALESCE CLEANUP命令。
ONLINE Move Partition
在线move分区
ALTER TABLE ... MOVE PARTITION 可以在线进行,不影响dml操作,全局索引会在move分区时进行,因此无需再手动进行index rebuild
ONLINE操作的限制:
(1)不支持sys用户下表及索引组织表(IOT)
(2)该功能对物化视图不可用
(3)不支持包含对象类型或bitmap join indexes以及domain indexes的表
(4)12.1.0.1中当启用database-level supplemental logging 时不支持online维护,12.1.0.2开始解除了该限制
(5)并行DML及直接路径插入操作需要对表加X锁,无法与move online操作同时进行
Cascade Functionality for TRUNCATE and EXCHANGE Partition
支持级联TRUNCATE和EXCHANGE分区
TRUNCATE和EXCHANGE分区操作为引用分区表提供级联功能,使分区维护操作的继承从父表继承到子表。大大简化了应用程序开发,并提供了逻辑数据一致性的原子执行。
Partial Indexes for Partitioned Tables
分区表部分索引
Local和Global indexes可以在部分分区上创建,这个特性通过表上的indexing属性来控制。注意,部分索引不能作为全局唯一索引。
Partition Maintenance Operations on Multiple Partitions
多分区维护操作
add/truncate/drop/split/merge分区操作允许在一个操作中一次操作多个分区
ALTER TABLE t1 MERGE PARTITIONS part_2015, part_2016, part_2017, part_2018 INTO PARTITION part_2018;
Interval Reference Partitioning
间隔引用分区
11g引入间隔分区,自动新建范围分区,例如partition by range(MSGTIME) interval (86400000)
间隔引用分区特性允许引用分区表将间隔分区作为顶级分区策略,这提供了更好的分区建模。间隔分区表可以用作引用分区的父表。在插入到引用分区表时, 创建引用分区表中与父表中的间隔分区相对应的分区。
当在子表中创建间隔分区时,分区名是从相关的父表片段继承而来的。如果子表具有表级的默认表空间,那么它就被用作新的间隔分区的表空间;否则,表空间是从父表片段继承的。
https://www.cndba.cn/leo1990/article/2069
12.2 Release
Online Conversion of a Nonpartitioned Table to a Partitioned Table
在线将非分区表转为分区表
支持在线将非分区表转为分区表,索引维护会在操作时自动进行,并且会转为分区索引(转换后索引状态正常,无需rebuild)。
12.2之前,想把一个非分区表转为分区表常用的方法如下:
- 建好分区表然后insert into select 把数据插入到分区表中
- 使用在线重定义(DBMS_REDEFINITION)的方法。
它们的缺点是:第一种方法,如果对表有频繁的DML操作,尤其是update操作,就需要停业务来做转换。第二种方法可以在线进行操作,不需要停业务,但操作步骤比较复杂,且可能出错。
Oracle12cR2版本中提供了一种新特性,一条语句就可以把非分区表转换为分区表,语法如下:
ALTER TABLE table_name MODIFY table_partitioning_clauses
[ filter_condition ] [ ONLINE ] [ UPDATE INDEXES [ ( index { local_partitioned_index | global_partitioned_index | GLOBAL } [, index { local_partitioned_index | global_partitioned_index | GLOBAL } ]... ) ] ]
Online SPLIT Partition and Subpartition
在线拆分分区和子分区
默认情况下,如果拆分的分区中有数据,那么以下表中的索引会被标记为UNUSEABLE:
- Regular (Heap)表:
除非在合并分区时指定UPDATE INDEXES,否则:
a) Oracle会将相应分区的本地索引标记为UNUSEABLE
b) 全局索引或所有分区的分区全局索引也会被标记为UNUSEABLE,并且必须重建。 - 索引组织表
a) 相应分区的本地索引标记为UNUSEABLE
b) 所有全局索引仍可用
ALTER TABLE vet_cats SPLIT PARTITION fee_katy at (100) INTO ( PARTITION fee_katy1, PARTITION fee_katy2);
ALTER INDEX JAF1 REBUILD PARTITION fee_katy1;
ALTER INDEX JAF1 REBUILD PARTITION fee_katy2;
Partitioning: Auto-List Partitioning
自动list分区
- 实现了list分区的自动化管理,类似11g版本开始支持的Interval Partitioning
- 没有default分区,必须至少指定一个分区
- 系统自动增加的分区会自动命名
- list分区到Auto-List可以转换,前提是List分区表定义上没有DEFAULT分区
CREATE TABLE enmotech (
PartID integer not null,
CretTm date not null,
PartCD varchar2(2) not null) partition by list (partcd) automatic (
partition pBJ values ('BJ'),
partition pCD values ('CD'),
partition pGZ values ('GZ'),
partition pSH values ('SH'));
https://www.eygle.com/archives/2016/12/oracle_122_autolist_partitioning.html
Interval Subpartioning
间隔子分区
- 从11g中开始支持的Interval Partitioning技术不支持子分区,从12.2开始支持。
- Interval Subpartioning和Interval Partitioning的使用条件及要求是一样的,如:没有MAXVALUE,没有Add Partition
- 间隔子分区在表级设置
- 每个表最大100万个[sub]partitions(从一个分区有100万个子分区到100万个分区每个分区一个子分区)
Partitioned External Tables
外部表支持分区
分区的外部表和存储在数据库中的分区表类似,但外部表分区可以存储在文件系统上,如Hive storage或HDFS。所有对外部表的限制和对分区表的限制在分区的外部表上都有。Oracle 数据库不能保证分区的外部文件包含满足分区定义的数据。
CREATE TABLE sales (loc_id number, prod_id number, cust_id number, amount_sold number, quantity_sold number)
ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY load_d1
ACCESS PARAMETERS
( RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
NOBADFILE
LOGFILE log_dir:'sales.log'
FIELDS TERMINATED BY ","
)
)
REJECT LIMIT UNLIMITED
PARTITION BY RANGE (loc_id)
(PARTITION p1 VALUES LESS THAN (1000) LOCATION ('california.txt'),
PARTITION p2 VALUES LESS THAN (2000) DEFAULT DIRECTORY load_d2 LOCATION ('washington.txt'),
PARTITION p3 VALUES LESS THAN (3000))
https://www.enmotech.com/web/detail/1/393/1.html
Partitioning: Filtered Partition Maintenance Operations
过滤分区维护操作
该特性允许我们在维护(Move/merge/split)分区表的时候进行数据过滤
对表进行分区,同时删除id大于50的数据(<=50的则保留)
ALTER TABLE t1 MODIFY
PARTITION BY RANGE (id) (
PARTITION t1_le_50 VALUES LESS THAN (51),
PARTITION t1_le_101 VALUES LESS THAN (101)
)
INCLUDING ROWS WHERE id <= 50;
注意including row 后跟的条件为保留的数据,千万别写反
ORACLE-BASE - Filtered Partition Maintenance Operations in Oracle Database 12c Release 2 (12.2)
Partitioning: Multi-Column List Partitioning
支持多列组合作为列表分区的分区键值
- 12.2.0.1.0开始支持,最多16列
- 支持分区和子分区
- 支持heap tables、external tables
- 支持Reference Partitioning 和 Auto-List
Partitioning: Read-Only Partitions
只读分区
可以将独立的分区/子分区设置为只读
注意:只读分区不允许drop,但对应的base table是可以被drop的
Partitioning: Table Creation for Partition Exchange
创建用于分区交换的表
新的DDL命令(CREATE TABLE FOR EXCHANGE WITH)允许创建与分区表的形式完全匹配的表,因此能够进行分区表的分区或子分区交换。 注意,索引不作为此命令的一部分创建。
创建能够进行分区或子分区交换的表对于已经进行了各种结构更改和重组的旧表而言可能是一个乏味的任务。 使用这个新的DDL,任务变得非常简单和直接实现。 与CREATE TABLE AS SELECT命令相比,它还向此类操作添加了一些隐式业务上下文。
CREATE TABLE sales_exchange TABLESPACE my_sales_tblspace FOR EXCHANGE WITH TABLE sales;
http://blog.itpub.net/28530558/viewspace-2152123/
18c Release
Modifying the Partitioning Strategy
修改堆组织表的分区策略
在18c中支持(在线)修改堆组织表的分区策略,例如将hash分区改为范围分区。索引作为表修改的一部分进行维护。
在修改分区策略时,所有索引列是新分区键前缀的未指定索引将自动转换为local分区索引,否则将索引转换为全局索引。但是不支持区域索引(domain indexes),UPDATE INDEXES子句不能更改索引列表最初定义的列、索引的唯一性等任何索引属性。
Oracle 18c 新特性-修改分区策略 -- cnDBA.cn_中国DBA社区
Parallel Partition-Wise SQL Operations
并行智能分区SQL操作
Parallel Partition-Wise join通过最小化并行执行连接时并行执行服务器之间交换的数据量来减少查询响应时间。这大大缩短了响应时间,并改善了CPU和内存资源的使用。在Oracle Real Application Clusters(RAC)环境中,分区连接还可以避免或至少限制互连上的数据流量,这是实现大规模连接操作的良好可伸缩性的关键。
目前可以兼容的SQL操作为:
- GROUP BY -- 12.2
- DISTINCT -- 12.2
- windowing functions -- 18.1
https://antognini.ch/2018/05/partition-wise-operations-new-features-in-12c-and-18c/
Online Merging of Partitions and Subpartitions
在线合并分区和子分区
ALTER TABLE cndba_doc MERGE PARTITIONS month_first, month_second INTO PARTITION month_fir_sec UPDATE INDEXES ONLINE;
默认情况下,如果拆分的分区中有数据,那么以下表中的索引会被标记为UNUSEABLE:
- Regular (Heap)表:
除非在合并分区时指定UPDATE INDEXES,否则:
a) Oracle会将相应分区的本地索引标记为UNUSEABLE
b) 全局索引或所有分区的分区全局索引也会被标记为UNUSEABLE,并且必须重建。 - 索引组织表
a) 相应分区的本地索引标记为UNUSEABLE
b) 所有全局索引仍可用
Maintenance Operations for Partitioned Tables and Indexes
19c Release
Hybrid partitioned tables
混合分区表
分区表的分区可以一些位于数据库中,另一些位于数据库外部的文件(比如操作系统文件或HDFS文件)
分区表历史回顾