有一个
sales 表,需按年份分区:
2023年及以后的数据:存储在数据库内部,支持快速DML操作。
2022年及以前的历史数据:存储在外部文件。
Oracle 19C 数据库(已启用
Oracle Hybrid Partitioned Tables 特性)。
外部存储目录:
/external_data(需创建Oracle目录对象)。
示例数据:
内部表分区:2023年数据。
外部表分区:2022年数据(以CSV文件存储)。
CREATE OR REPLACE DIRECTORY ext_dir AS '/external_data'; GRANT READ, WRITE ON DIRECTORY ext_dir TO schema_user;
将2022年数据导出为CSV文件
/external_data/sales_2022.csv,格式如下:
sale_id,product_id,sale_date,amount 1001,501,2022-01-15,1500 1002,502,2022-06-20,2300 ...
CREATE TABLE sales (
sale_id NUMBER,
product_id NUMBER,
sale_date DATE,
amount NUMBER
)
PARTITION BY RANGE (sale_date)
(
-- 外部分区(2022年及以前):存储在CSV文件中
PARTITION p_2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD'))
EXTERNAL LOCATION (ext_dir:'sales_2022.csv') -- 指定外部文件
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(sale_id, product_id, sale_date DATE 'YYYY-MM-DD', amount)
)
REJECT LIMIT UNLIMITED
TYPE ORACLE_LOADER, -- 使用SQL*Loader驱动解析外部文件
-- 内部分区(2023年及以后)
PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
PARTITION p_future VALUES LESS THAN (MAXVALUE)
);
INSERT INTO sales VALUES (2001, 601, DATE '2023-03-10', 4500); COMMIT;
-- 查询所有分区数据(内部+外部) SELECT * FROM sales; -- 单独查询外部分区 SELECT * FROM sales PARTITION (p_2022); -- 查看分区存储类型 SELECT partition_name, hybrid, external FROM USER_TAB_PARTITIONS WHERE table_name = 'SALES';
输出示例:
PARTITION_NAME HYBRID EXTERNAL --------------- ------- -------- P_2022 YES YES P_2023 YES NO P_FUTURE YES NO
ALTER TABLE sales ADD PARTITION p_2024
VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'));
-- 假设需将2023年数据迁移到外部存储(需先导出为CSV) -- 1. 导出数据到文件 `/external_data/sales_2023.csv` -- 2. 修改分区定义 ALTER TABLE sales MODIFY PARTITION p_2023 EXTERNAL LOCATION (ext_dir:'sales_2023.csv') ACCESS PARAMETERS (...); -- 参数需与外部文件格式匹配
CREATE INDEX idx_sales_date ON sales(sale_date) LOCAL;
-- 仅扫描2023年分区(内部) SELECT * FROM sales WHERE sale_date BETWEEN DATE '2023-01-01' AND DATE '2023-12-31';
混合存储模式:
内部表分区:支持标准DML操作(INSERT/UPDATE/DELETE)。
外部表分区:数据存储在外部文件(如CSV、Parquet),仅支持查询。
统一访问接口:
通过标准SQL查询内部和外部数据,无需应用层感知存储位置。
动态分区管理:
可动态将内部分区转换为外部(需导出数据),反之亦然。
外部文件格式:
必须使用
ORACLE_LOADER 或
ORACLE_DATAPUMP 访问驱动程序。
文件需严格匹配表结构定义,否则查询会报错。
性能差异:
外部分区查询速度受文件I/O限制,不适合高频访问。
数据一致性:
外部文件需手动维护,避免与内部数据冲突。
权限管理:
确保数据库用户有权限读写外部目录。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31547506/viewspace-3075008/ ,如需转载,请注明出处,否则将追究法律责任。