12.1 - 19c Oracle分区表的新特性

22 篇文章 0 订阅
3 篇文章 1 订阅

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命令。

Oracle 12c 新特性 ---异步全局索引维护,用于删除和截断分区 -- cnDBA.cn_中国DBA社区

oracle12c新特性之异步全局索引维护_ITPUB博客


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分区操作为引用分区表提供级联功能,使分区维护操作的继承从父表继承到子表。大大简化了应用程序开发,并提供了逻辑数据一致性的原子执行。

Oracle 12c 新特性 --- 级联截断和交换分区_Leo-2016的博客-CSDN博客_级联截断

Partial Indexes for Partitioned Tables
分区表部分索引

Local和Global indexes可以在部分分区上创建,这个特性通过表上的indexing属性来控制。注意,部分索引不能作为全局唯一索引。

https://www.cnblogs.com/andy6/p/6857209.html


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;

https://blog.csdn.net/leo__1990/article/details/90051056


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 } ]... ) ] ]

Oracle 12c 新特性 --- 将非分区表在线转换到分区表_Leo-2016的博客-CSDN博客_oracle 转 hash分区 在线转
Oracle 12.2新特性----在线把非分区表转为分区表_51CTO博客_Oracle 分区表

Changing a Nonpartitioned Table into a Partitioned Table


Online SPLIT Partition and Subpartition

在线拆分分区和子分区

默认情况下,如果拆分的分区中有数据,那么以下表中的索引会被标记为UNUSEABLE:

  1. Regular (Heap)表:
    除非在合并分区时指定UPDATE INDEXES,否则:
    a) Oracle会将相应分区的本地索引标记为UNUSEABLE
    b) 全局索引或所有分区的分区全局索引也会被标记为UNUSEABLE,并且必须重建。
  2. 索引组织表
    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操作为:

  1. GROUP BY -- 12.2
  2. DISTINCT -- 12.2
  3. 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:

  1. Regular (Heap)表:
    除非在合并分区时指定UPDATE INDEXES,否则:
    a) Oracle会将相应分区的本地索引标记为UNUSEABLE
    b) 全局索引或所有分区的分区全局索引也会被标记为UNUSEABLE,并且必须重建。
  2. 索引组织表
    a) 相应分区的本地索引标记为UNUSEABLE
    b) 所有全局索引仍可用

https://blog.csdn.net/qianglei6077/article/details/87074321 

Maintenance Operations for Partitioned Tables and Indexes

19c Release
 

Hybrid partitioned tables

混合分区表

分区表的分区可以一些位于数据库中,另一些位于数据库外部的文件(比如操作系统文件或HDFS文件)

https://blog.csdn.net/Hehuyi_In/article/details/90482830

分区表历史回顾

版本

新支持的分区方法

说明

7.3.x

逻辑分区/分区视图

◊在Oracle  8版本前,DBAs和Consultants  根据系统需要实现了"Home-Grown"(自产的/土生土长的)分区方法,他们借助UNION-ALL  Views或Partition  Views(7.3开始提供的分区视图,需要配合初始化参数PARTITION_VIEW_ENABLED=TRUE来使用Optimizer  Prunes特性)实现,即使到今天,如果不采购Oracle  Database Enterprise Edition下的Partitioning  Option License,从许可上来讲,也必须借助这种Home-Grown的方法来实现。
 ◊这种方法对DML是不透明的

◊Partition  Views in 7.3: Examples and Tests (文档 ID 43194.1)

8.0.x

Oracle  8.5 开始支持分区表/索引,

首先提供范围分区(range)

1)使Oracle成为了第一个支持物理分区的RDBMS供应商
 2)Oracle  8 仅支持表和索引级的分区(  Clustered tables/indexes and snapshots are not supported)
 3)Oracle  8中不可以update  partition key columns,否则会遇到ORA-14402错误
 4)只实现了静态的分区裁剪功能

5)支持索引的Local  and global Range

8i

新增加希分区(hash)

开始支持范围-哈希复合分区(range-hash)

8.1.7实现了动态智能裁剪(Dynamic  partition pruning)和智能连接(Partition-wise  joins)

9iR1

新增列表分区(list)

开始支持全局索引维护

1)在9i(9.0.1)之前, IOT表只支持range分区,实际上是从8.1.5版本开始支持对IOT的range分区
 2)从9i开始支持对IOT的range、hash分区
 3)在9iR2  hash分区支持IOT表中包含lob列(9i中暂不支持包含lob类型的IOT  hash 分区)

4)支持Global  index maintenance

9iR2

开始支持范围-列表复合分区(range-list)

1)Fast Split
 2)DEFAULT  Partition for LIST

10gR1

1)增加了对索引组织表(IOT)  列表(list)分区功能
 2)增加了对全局分区索引的hash分区策略
 3)10gR2开始一个表可以支持1024K-1个分区(以前是64K-1)

1)扩展了global  indexes on partitioned IOTs的维护支持
 2)Local  partitioned bitmap indexes on partitioned IOTs
 3)LOB  columns are now supported in all types of partitioned IOTs.

4)fast  split partition支持分区IOT表

10gR2

11g

Interval  Partitioning

实现了范围分区的自动化

System  Partitioning(系统分区)

在这个新的类型中,我们不需要指定任何分区键,数据会进入哪个分区完全由应用程序决定,实际上也就是由SQL来决定,终于我们在Insert语句中可以指定插入哪个分区了

More  Composite Partitioning (更多的复合分区)

在9i、10g中,复合分区只支持Range-List和Range-Hash
 在11gR1中复合分区的类型大大增加,现在Range,List,Interval都可以作为Top level分区,而Second level则可以是Range,List,Hash,也就是在11gR1中可以有3*3=9种复合分区,可以满足更多的业务需要.
 在11gR2中,又增加了hash-hash复合分区

Reference  Partitioning(外键也叫引用分区)

分区方案的引入是以相关表格通过相同的分区策略获得好处作为前提设想的。Detail表格通过PK-FK关系从master表格继承相同的分区方案.我们不需要把分区键存储在detail表格中,通过关键词“PARTITION BY REFERENCE,detail表格获得master表格的分区方案

虚拟列分区(Virtual Column-Based  Partitioning)

在11g之前,只有分区键存在于表格中才可以实现对表格的分区功能。而Oracle  11g的新功能“虚拟列”打破了这一限制,允许通过使用表格中的一列或多列的计算式作为分区键。

分区建议器

SQL  Access Advisor 不但可以为索引、物化视图和物化视图日志提供建议,还可以生成分区建议。执行  SQL Access Advisor 生成的建议,您将会看到预期的性能收益。可以手动实施生成的脚本,也可以将其提交给  Oracle Enterprise Manager 中的一个队列。借助分区建议扩展,客户不仅可以获得专门针对分区的建议,还可以获得  SQL Access Advisor 的更全面的整体建议,从而在总体上提高  SQL 语句的整体性能。

Partition  Advisor 已集成到  SQL Access Advisor 中,是  Oracle Tuning Pack(一个额外的许可选件)的组成部分。

12cR1

Online  Partition 维护

1)在线移动、压缩分区或子分区,不阻赛DML操作

      alter table sales move partition p1  tablespace lowtbs update indexes online;

      alter table sales move partition p1 ROW STORE COMPRESS BASIC update  indexes online;
      alter table sales move  partition p1 ROW STORE COMPRESS ADVANCED  update indexes online;
      alter table sales move  partition p1 COLUMN STORE COMPRESS FOR  QUERY LOW update indexes online;
      alter table sales move  partition p1 COLUMN STORE COMPRESS FOR  QUERY HIGH update indexes online;
      alter table sales move  partition p1 COLUMN STORE COMPRESS FOR  ARCHIVE LOW update indexes online;
      alter table sales move  partition p1 COLUMN STORE COMPRESS FOR  ARCHIVE HIGH update indexes online;

      select table_name,compression,compress_for  from dba_tables;
      select table_name,partition_name, compression,compress_for  from dba_tab_partitions;

      参见示例

2)Restrictions on the ONLINE Clause  --详见官方文档里的说明
    (1)不支持sys用户下表
    (2)不支持索引组织表(IOT)
    (3)不支持包含对象类型或bitmap  join indexes以及domain  indexes的表
    (4)当打开database-level  supplemental logging 时不支持online维护
    (5)Parallel  DML and direct path INSERT operations require an  exclusive lock on the table. 所以,  these operations are not supported concurrently with an ongoing online  partition MOVE, due to conflicting locks.

Reference  Partitioning的增强

1)支持Interval-Reference分区
 2)提供truncate  partition、exchange  [SUB]partition操作的CASCADE级联选项

多分区维护操作

add/truncate/drop/split/merge分区操作允许在一个操作中一次操作多个分区

部分索引

Local和Global indexes可以在部分分区上创建,这个特性(Partial  Indexing on Partitioned Tables)是通过表表上的indexing属性来控制的。注意,部分索引不能创建全局唯一索引。

全局索引异步维护

1)对于Drop和Truncate  Parition 操作,支持异步维护全局索引,Update  Indexes字句仅仅维护metadata,真正的索引维护是通过一个JOB(SYS.PMO_DEFERRED_GIDX_MAINT_JOB)异步完成的。缺省情况下该job是每天凌晨2:00执行,也可手工调用dbms_part.cleanup_gidx来完成

      PROCEDURE CLEANUP_GIDX                  - To clean up the global indexes 
      PROCEDURE CLEANUP_GIDX_INTERNAL  - To clean up the internal tables
      PROCEDURE CLEANUP_ONLINE_OP        - To clean up the online partition movements

2)DBA_INDEXES  和DBA_IND_PARTITIONS新增加了ORPHANED_ENTRIES列。该列用来指出whether  or not a global index (partition) contains stale entries due to deferred  index maintenance during DROP/TRUNCATE PARTITION, or MODIFY PARTITION  operations. 有三种取值:
 YES: The index (partition) contains  orphaned entries
  NO: The index (partition) does  not contain any orphaned entries
 N/A: The property is not applicable –  this is the case for local indexes, or indexes on non-partitioned tables.

12cR2

Multi-Column  List Partition

1)12.2.0.1.0开始支持,最大16个列

2)支持分区和子分区

3)支持heap  tables、external  tables

4)支持Reference  Partitioning and Auto-List

Auto-List  Partitioning

1)实现了list分区的自动化管理,类似11g版本开始支持的Interval  Partitioning

2)没有default分区,必须至少指定一个分区

3)系统自动增加的分区会自动命名

4)list分区到Auto-List可以转换,前提是List分区表定义上没有DEFAULT分区

Interval  Subpartioning

1)  从11g版本中开始支持的Interval  Partitioning技术不支持子分区,从12cR2版本开始支持。

2)  Interval Subpartioning和Interval  Partitioning的使用条件及要求是一样的,如:

     --没有MAXVALUE

     --没有Add  Partition

3)  Interval-subpartitoning strategy set at table level
     --Subpartiton template mandatory
     --Interval identical for all partitions

4)  每个表最大100万个[sub]partitions

     --From one partition with one million subpartitions ..
     --..To one million partitions with one subpartition each

Partitioned  External Tables

Partitioned  external tables will provide both the functionality to map partitioned Hive  tables into the Oracle ecosystem as well as providing declarative  partitioning on top of any Hadoop Distributed File System (HDFS) based data  store.

分区与Sharding

–数据垂直分区到多个独立的数据库中
 –线性扩展
 –自动部署
 –支持HASH、RANGE、LIST和复合方式的自动数据分区
 –自动Rebalance和Resharding

分区表相关维护维护方面的增强

Online分区维护(DDL)的

11g

Create  index
 Add column
 Add constraint

12cR1

Drop  index
 Drop Constraint
 Alter table set unused column
 Alter table move partition

12cR2

Alter  table modify non-partitioned table to partitioned table 
 Alter table move online for heap tables

Alter  table split partition online

Filtered分区维护操作

该特性允许我们在维护(Move/merge/split)分区表的时候进行数据过滤

alter table orders_move_part 
 move partition Q1_2015 tablespace tbs_archive compress
 INCLUDE ROWS where order_state='open';

快速创建分区交换中间表

Oracle  Database 12c 第 2 版中的FOR EXCHANGE WITH子句消除了分区交换的检测性工作,Indexes  are not created as part of this command. eg:

create table  sales_exch for exchange with sales;

只读分区

分区/子分区可以被设置为read  only或read  write(default)。

注意:只读分区不允许drop,但对应的base  table是可以被drop的,所以不要寄望于这个做更加级别的安全保护,还是要配合权限和其他安全措施来保护。

tips:这样从12cR2/18c开始,可以做到Service->Oracle_Home->Instance-->PDB->Tablespace  ->Table/MV/外部表->Partition->subpartition等各个级别的只读设置,配合对象只读权限(read)、系统只读权限(read  any table)及Schema  Only Accounts等特性,可以满足各个层次的数据保护需求。

18c

18.1.0

Enhanced  Parallel Partition-wise Operations

参见这里

·         Partition-Wise  Operations

·         Partition-Wise  Joins in a Data Warehouse

相关知识:Partition-Wise  Operations – New Features in 12c and 18c

Modifying  the Partitioning Strategy 参见这里的文档说明。

Online  Merging of Partitions and Subpartitions

这是18c(18.1.0)中针对分区技术的一个很酷的改进,在不影响业务的情况下,可以在线合并分区或子分区。参见这里的文档说明。

19c

19.2

Hybrid  partitioned tables--混合分区表

参考

https://en.enmotech.com/web/detail/1/659/1.html

Oracle Database Features

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值