Oracle混合分区表通过将传统的内部分区表和外部分区表结合起来,从而形成了更加通用的分区,叫做混合分区表。
启用混合分区表更易将内部分区和外部分区集成到单个分区表中。该特性还可以很容易的将非活跃分区移动到外部文件中,从而得降低存储解决方案成本。
混合分区表的分区可以驻留在oracle 表空间和外部源中,列如使用逗号分隔符(CSV)记录的Linux 文件或者是使用java服务的HDFS上的文件。混合分区表支持现有的外部表类型的外部分区:ORACLE_DATAPUMP,ORACLE_LOADER,ORACLE_HDFS,ORACLE_HIVE。外部分区的外部表类型使用下列访问驱动类型:
· ORACLE_DATAPUMP
· ORACLE_LOADER
· ORACLE_HDFS
· ORACLE_HIVE
对于ORACLE_LOADER 和ORACLE_DATAPUMP 的外部分区访问驱动类型,需授权用户下列权限:
· 数据文件所在目录的READ权限
· 日志文件和错误文件所在目录的WRITE权限
· 预处理程序所在目录的EXECUTE 权限
表级别的外部参数应用于混合分区表的所有分区。例如,在EXTERNAL PARTITION ATTRIBUTES 语句中定义的DEFAULT DIRECTORY 值,该目录是数据文件、日志文件和错误文件的默认位置。你可以在分区语句中使用DEFAULT DIRECTORY 覆盖默认的目录位置。对于ORACLE_HIVE 和 ORACLE_HDFS 访问驱动类型的外部分区,DEFAULT DIRECTORY 仅仅用户来存储指定的日志文件。
对于存储在外部分区上的数据不支持约束执行,因为约束应用于整个表。例如,主键和外键约束不能在一个混合分区表上强制执行。只有约束处于 RELY DISABLE 模式下,例如 NOT NULL,主键约束,唯一约束,和外键约束在混合分区表中是支持的。基于这些约束的动态优化,需设置会话参数 QUERY_REWRITE_INTEGRITY 、TRUSTED 或者 STALE_TOLERATED.
混合分区表通过内部和外部分区可以使用基于分区的优化。基于分区的优化包括以下内部和外部数据源:
· Static partition pruning
· Dynamic partition pruning
· Bloom pruning
混合分区表为用户提供了内部和外部分区移动数据的功能。但是,定义在表级别的ADO 对表的内部分区是有影响的。
以下是在混合分区表上支持的的操作:
· 创建单级别的 RANGE 和 LIST 分区方式
· 使用ALTER TABLE … DDLs 列如 ADD,DROP 和RENAME 分区
· 在外部分区中修改外部数据源的分区级别(不知道翻译的准不准确待定)
· 将已有的内部分区表更改为包含内部和外部分区的混合分区表
· 更改现有位置为空,从而使外部分区为空
· 在内部分区上创建全局部分非唯一索引
· 在内部分区上创建物化视图
· 在QUERY_REWRITE_INTEGRITY 、STALE TOLERATE 模式下创建包含外部分区的物化视图
· 在外部分区上支持完全刷新所有分区
· 在混合分区表中的内部分区可以进行DML触发器操作
· 在混合分区表中使用ANALYZE TABLE …VALIDATE STRUCTURE 仅校验内部分区
· 将已存在的没有外部分区的混合分区表更改为仅具有内部分区的分区表
· 一个内部分区可以更改为外部非分区表。反之亦然。
Restrictions on Hybrid Partitioned Tables
The following are restrictions and limitations on hybrid partitioned tables.
• Restrictions that apply to external tables also apply to hybrid partitioned tables unless explicitly noted
• No support for REFERENCE and SYSTEM partitioning methods
• Only single level LIST and RANGE partitioning are supported.
• No unique indexes or global unique indexes. Only partial indexes are allowed and unique indexes cannot be partial.
• Only single level list partitioning is supported for HIVE.
• Attribute clustering (CLUSTERING clause) is not allowed.
• DML operations only on internal partitions of a hybrid partitioned table (external partitions are treated as read-only partitions)
• In-memory defined on the table level only has an effect on internal partitions of the hybrid partitioned table.
• No column default value
• Invisible columns are not allowed.
• The CELLMEMORY clause is not allowed.
• SPLIT, MERGE, and MOVE maintenance operations are not allowed on internal partitions.
• LOB, LONG, and ADT types are not allowed.
• Only RELY constraints are allowed
创建一个混合分区表
使用SYS用户
#创建目录
SQL> CREATE DIRECTORY sales_data AS '/home/oracle/sales_data';
Directory created.
#授权
SQL> GRANT READ,WRITE ON DIRECTORY sales_data TO hr;
Grant succeeded.
#创建目录2
SQL> CREATE DIRECTORY sales_data2 AS '/home/oracle/sales_data2';
Directory created.
SQL> GRANT READ,WRITE ON DIRECTORY sales_data2 TO hr;
Grant succeeded.
SQL> CREATE DIRECTORY sales_data3 AS '/home/oracle/sales_data3';
Directory created.
SQL> GRANT READ,WRITE ON DIRECTORY sales_data3 TO hr;
Grant succeeded.
SQL> CREATE DIRECTORY sales_data_acfs AS '/home/oracle/acfs1';
Directory created.
SQL> GRANT READ,WRITE ON DIRECTORY sales_data_acfs TO hr;
Grant succeeded.
SQL> conn hr/hr;
Connected.
CREATE TABLE hybrid_partition_table
( prod_id NUMBER NOT NULL,
cust_id NUMBER NOT NULL,
time_id DATE NOT NULL,
channel_id NUMBER NOT NULL,
promo_id NUMBER NOT NULL,
quantity_sold NUMBER(10,2) NOT NULL,
amount_sold NUMBER(10,2) NOT NULL
)
EXTERNAL PARTITION ATTRIBUTES (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY sales_data
ACCESS PARAMETERS(
FIELDS TERMINATED BY ','
(prod_id,cust_id,time_id DATE 'dd-mm-yyyy',channel_id,promo_id,quantity_sold,amount_sold)
)
REJECT LIMIT UNLIMITED
)
PARTITION BY RANGE (time_id)
(PARTITION sales_2014 VALUES LESS THAN (TO_DATE('01-01-2015','dd-mm-yyyy')),
PARTITION sales_2015 VALUES LESS THAN (TO_DATE('01-01-2016','dd-mm-yyyy')),
PARTITION sales_2016 VALUES LESS THAN (TO_DATE('01-01-2017','dd-mm-yyyy')) EXTERNAL
LOCATION ('sales2016_data.txt'),
PARTITION sales_2017 VALUES LESS THAN (TO_DATE('01-01-2018','dd-mm-yyyy')) EXTERNAL
DEFAULT DIRECTORY sales_data2 LOCATION ('sales2017_data.txt'),
PARTITION sales_2018 VALUES LESS THAN (TO_DATE('01-01-2019','dd-mm-yyyy')) EXTERNAL
DEFAULT DIRECTORY sales_data3 LOCATION ('sales2018_data.txt'),
PARTITION sales_2019 VALUES LESS THAN (TO_DATE('01-01-2020','dd-mm-yyyy')) EXTERNAL
DEFAULT DIRECTORY sales_data_acfs LOCATION ('sales2019_data.txt')
);
Table created.
ALTER TABLE hybrid_partition_table
ADD PARTITION sales_2020 VALUES LESS THAN (TO_DATE('01-01-2021','dd-mm-yyyy'))
EXTERNAL DEFAULT DIRECTORY sales_data_acfs LOCATION ('sales2020_data.txt');
Table altered.
未完待续