作者:胖头鱼的鱼缸(尹海文) Oracle ACE Pro: Database PostgreSQL ACE 10年+数据库行业经验 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVP,ITPUB认证专家 圈内拥有“总监”称号,非著 名社恐(社交恐怖分子) 全网同名:胖头鱼的鱼缸 ITPUB:yhw1809 除授权转载并标明出处外,均为“非法”抄袭

Oracle AI Database 23.26.1 引入了表达式分区(Partition by Expression)功能。此前,要基于表达式进行分区(如对日期进行截断后再分区),必须先创建一个虚拟列作为分区键,然后在分区子句中引用该虚拟列。
Partition by Expression 消除了这一中间步骤,允许开发者直接在 PARTITION BY 子句中使用 SQL 表达式定义分区键。这简化了 Schema 设计,减少了 DDL 编写的复杂性,同时使分区定义更加直观和表达力更强。
传统方式(需虚拟列):
CREATE TABLE sales ( sale_id NUMBER, sale_date DATE, amount NUMBER, qtr GENERATED ALWAYS AS (TRUNC(sale_date, 'Q')) ) PARTITION BY RANGE (qtr) ( PARTITION p_q1 VALUES LESS THAN (DATE '2026-04-01'), ... );
表达式分区(新方式):
CREATE TABLE sales ( sale_id NUMBER, sale_date DATE, amount NUMBER ) PARTITION BY RANGE (TRUNC(sale_date, 'Q')) ( PARTITION p_q1 VALUES LESS THAN (DATE '2026-04-01'), ... );
支持的表达式类型:
同之前一样,使用用户NFTEST,已授权DB_DEVELOPER_ROLE角色,测试操作均在NFTEST用户下执行。
CREATE TABLE pbe_sales ( sale_id NUMBER, product VARCHAR2(100), sale_date DATE, amount NUMBER ) PARTITION BY RANGE (TRUNC(sale_date, 'Q')) ( PARTITION p_q1 VALUES LESS THAN (DATE '2026-04-01'), PARTITION p_q2 VALUES LESS THAN (DATE '2026-07-01'), PARTITION p_q3 VALUES LESS THAN (DATE '2026-10-01'), PARTITION p_q4 VALUES LESS THAN (DATE '2027-01-01'), PARTITION p_max VALUES LESS THAN (MAXVALUE) );

INSERT INTO pbe_sales VALUES (1, 'Widget', DATE '2026-01-15', 100); INSERT INTO pbe_sales VALUES (2, 'Gadget', DATE '2026-04-10', 200); INSERT INTO pbe_sales VALUES (3, 'Widget', DATE '2026-07-20', 150); INSERT INTO pbe_sales VALUES (4, 'Gadget', DATE '2026-11-05', 300); COMMIT; SELECT sale_id, product, sale_date, amount FROM pbe_sales ORDER BY sale_id;

SELECT table_name, partition_name FROM all_tab_partitions WHERE table_owner = 'NFTEST' AND table_name = 'PBE_SALES' ORDER BY partition_position;

SELECT sale_id, product, amount FROM pbe_sales WHERE TRUNC(sale_date, 'Q') = DATE '2026-01-01' ORDER BY sale_id;

CREATE TABLE pbe_orders ( order_id NUMBER, customer VARCHAR2(100), order_date DATE, total NUMBER ) PARTITION BY RANGE (EXTRACT(YEAR FROM order_date)) ( PARTITION p_2025 VALUES LESS THAN (2026), PARTITION p_2026 VALUES LESS THAN (2027), PARTITION p_2027 VALUES LESS THAN (2028), PARTITION p_max VALUES LESS THAN (MAXVALUE) ); INSERT INTO pbe_orders VALUES (101, 'AAA Corp', DATE '2025-06-15', 5000); INSERT INTO pbe_orders VALUES (102, 'BBB Ltd', DATE '2026-03-10', 8000); INSERT INTO pbe_orders VALUES (103, 'CCC Inc', DATE '2026-09-20', 3000); COMMIT; SELECT order_id, customer, order_date, total FROM pbe_orders ORDER BY order_id;

本期对 Oracle AI Database 26ai,23.26.1 版本新引入的表达式分区进行了完整介绍与实战演示。
老规矩,知道写了些啥。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31466763/viewspace-3185313/ ,如需转载,请注明出处,否则将追究法律责任。