Accessing a PARTITION or SUBPARTITION v18
For a partitioned table, you can access the partition or subpartition using PARTITION part_name or SUBPARTITION subpart_name. This example creates a partitioned table sales that's range partitioned by date and subpartitioned using list partitioning by the country column:
CREATE TABLE sales ( dept_no number, part_no varchar2, country varchar2(20), date date, amount number ) PARTITION BY RANGE(date) SUBPARTITION BY LIST(country) ( PARTITION q1_2020 VALUES LESS THAN('2020-Apr-01') ( SUBPARTITION q1_europe VALUES ('FRANCE', 'ITALY'), SUBPARTITION q1_asia VALUES ('INDIA', 'PAKISTAN'), SUBPARTITION q1_americas VALUES ('US', 'CANADA') ), PARTITION q2_2020 VALUES LESS THAN('2020-Jul-01') ( SUBPARTITION q2_europe VALUES ('FRANCE', 'ITALY'), SUBPARTITION q2_asia VALUES ('INDIA', 'PAKISTAN'), SUBPARTITION q2_americas VALUES ('US', 'CANADA') ) );
The SELECT statement shows two partitions. Each partition has three subpartitions.
edb=# SELECT subpartition_name, high_value, partition_name FROM ALL_TAB_SUBPARTITIONS;
subpartition_name | high_value | partition_name -------------------+---------------------+---------------- Q1_EUROPE | 'FRANCE', 'ITALY' | Q1_2020 Q1_ASIA | 'INDIA', 'PAKISTAN' | Q1_2020 Q1_AMERICAS | 'US', 'CANADA' | Q1_2020 Q2_EUROPE | 'FRANCE', 'ITALY' | Q2_2020 Q2_ASIA | 'INDIA', 'PAKISTAN' | Q2_2020 Q2_AMERICAS | 'US', 'CANADA' | Q2_2020 (6 rows)
This INSERT statement inserts rows into the sales table using specific PARTITION part_name or SUBPARTITION subpart_name values:
INSERT INTO sales PARTITION (q1_2020) VALUES (10, 'q1_2020', 'FRANCE', '2020-Feb-01', '500000'); INSERT INTO sales PARTITION (q2_2020) VALUES (10, 'q2_2020', 'ITALY', '2020-Apr-01', '550000'); INSERT INTO sales SUBPARTITION (q1_europe) VALUES (10, 'q1_europe', 'FRANCE', '2020-Feb-01', '600000'); INSERT INTO sales SUBPARTITION (q2_asia) VALUES (10, 'q2_asia', 'INDIA', '2020-Apr-01', '650000'); edb=# SELECT tableoid::regclass, * FROM sales ORDER BY date;
tableoid | dept_no | part_no | country | date | amount -----------------+---------+-----------+---------+--------------------+-------- sales_q1_europe | 10 | q1_2020 | FRANCE | 01-FEB-20 00:00:00 | 500000 sales_q1_europe | 10 | q1_europe | FRANCE | 01-FEB-20 00:00:00 | 600000 sales_q2_europe | 10 | q2_2020 | ITALY | 01-APR-20 00:00:00 | 550000 sales_q2_asia | 10 | q2_asia | INDIA | 01-APR-20 00:00:00 | 650000 (4 rows)
Use this query to fetch the values from a specific partition q1_2020 or subpartition q1_europe:
edb=# SELECT tableoid::regclass, * FROM sales PARTITION (q1_2020) ORDER BY date; tableoid | dept_no | part_no | country | date | amount -----------------+---------+-----------+---------+--------------------+-------- sales_q1_europe | 10 | q1_2020 | FRANCE | 01-FEB-20 00:00:00 | 500000 sales_q1_europe | 10 | q1_europe | FRANCE | 01-FEB-20 00:00:00 | 600000 (2 rows) edb=# SELECT tableoid::regclass, country FROM sales SUBPARTITION (q1_europe) ORDER BY date; tableoid | country -----------------+--------- sales_q1_europe | FRANCE sales_q1_europe | FRANCE (2 rows)
This SELECT statement selects rows from a specific partition or subpartition of a partitioned table by specifying the keyword PARTITION or SUBPARTITION:
edb=# SELECT tableoid::regclass, * FROM sales PARTITION (q2_2020) ORDER BY country;
tableoid | dept_no | part_no | country | date | amount -----------------+---------+---------+---------+--------------------+-------- sales_q2_asia | 10 | q2_asia | INDIA | 01-APR-20 00:00:00 | 650000 sales_q2_europe | 10 | q2_2020 | ITALY | 01-APR-20 00:00:00 | 550000 (2 rows)
edb=# SELECT tableoid::regclass, date FROM sales SUBPARTITION (q2_asia) ORDER BY country;
tableoid | date ---------------+-------------------- sales_q2_asia | 01-APR-20 00:00:00 (1 row)
This UPDATE statement updates values in a partition or subpartition of the sales table:
edb=# UPDATE sales PARTITION (q1_2020) SET amount = 10000 WHERE amount = 500000 RETURNING tableoid::regclass, *;
tableoid | dept_no | part_no | country | date | amount -----------------+---------+---------+---------+--------------------+-------- sales_q1_europe | 10 | q1_2020 | FRANCE | 01-FEB-20 00:00:00 | 10000 (1 row) UPDATE 1
edb=# UPDATE sales SUBPARTITION (q1_europe) SET amount = 5000 WHERE amount = 600000 RETURNING tableoid::regclass, *;
tableoid | dept_no | part_no | country | date | amount -----------------+---------+-----------+---------+--------------------+-------- sales_q1_europe | 10 | q1_europe | FRANCE | 01-FEB-20 00:00:00 | 5000 (1 row) UPDATE 1
This DELETE statement removes rows from the partition q2_2020 or subpartition q2_asia of the sales table:
edb=# DELETE FROM sales PARTITION (q2_2020) WHERE amount = 550000 RETURNING tableoid::regclass, *;
tableoid | dept_no | part_no | country | date | amount -----------------+---------+---------+---------+--------------------+-------- sales_q2_europe | 10 | q2_2020 | ITALY | 01-APR-20 00:00:00 | 550000 (1 row) DELETE 1
edb=# DELETE FROM sales SUBPARTITION (q2_asia) RETURNING tableoid::regclass, *;
tableoid | dept_no | part_no | country | date | amount ---------------+---------+---------+---------+--------------------+-------- sales_q2_asia | 10 | q2_asia | INDIA | 01-APR-20 00:00:00 | 650000 (1 row) DELETE 1
Using alias for accessing PARTITION or SUBPARTITION
You can use aliases with SELECT, INSERT, UPDATE, or DELETE statements to access a partition or subpartition. This example creates a partitioned table sales that's range partitioned by date and subpartitioned using list partitioning by the country column:
CREATE TABLE sales ( dept_no number, part_no varchar2, country varchar2(20), date date, amount number ) PARTITION BY RANGE(date) SUBPARTITION BY LIST(country) ( PARTITION q1_2020 VALUES LESS THAN('2020-Apr-01') ( SUBPARTITION q1_europe VALUES ('FRANCE', 'ITALY'), SUBPARTITION q1_asia VALUES ('INDIA', 'PAKISTAN'), SUBPARTITION q1_americas VALUES ('US', 'CANADA') ), PARTITION q2_2020 VALUES LESS THAN('2020-Jul-01') ( SUBPARTITION q2_europe VALUES ('FRANCE', 'ITALY'), SUBPARTITION q2_asia VALUES ('INDIA', 'PAKISTAN'), SUBPARTITION q2_americas VALUES ('US', 'CANADA') ) );
The SELECT statement shows two partitions. Each partition has three subpartitions.
edb=# SELECT subpartition_name, high_value, partition_name FROM ALL_TAB_SUBPARTITIONS;
subpartition_name | high_value | partition_name -------------------+---------------------+---------------- Q1_EUROPE | 'FRANCE', 'ITALY' | Q1_2020 Q1_ASIA | 'INDIA', 'PAKISTAN' | Q1_2020 Q1_AMERICAS | 'US', 'CANADA' | Q1_2020 Q2_EUROPE | 'FRANCE', 'ITALY' | Q2_2020 Q2_ASIA | 'INDIA', 'PAKISTAN' | Q2_2020 Q2_AMERICAS | 'US', 'CANADA' | Q2_2020 (6 rows)
This INSERT statement creates an alias of the sales table and inserts rows into partition q1_2020 and q2_2020 or subpartition q1_europe and q1_asia:
INSERT INTO sales PARTITION (q1_2020) AS q1_sales VALUES (10, 'q1_2020', 'FRANCE', '2020-Feb-01', '500000'); INSERT INTO sales PARTITION (q2_2020) q2_sales (q2_sales.dept_no, q2_sales.part_no, q2_sales.country, q2_sales.date, q2_sales.amount) VALUES (20, 'q2_2020', 'ITALY', '2020-Apr-01', '550000'); INSERT INTO sales SUBPARTITION (q1_europe) AS sales_q1_europe VALUES (10, 'q1_europe', 'FRANCE', '2020-Feb-01', '600000'); INSERT INTO sales SUBPARTITION (q1_asia) sales_q1_asia (sales_q1_asia.dept_no, sales_q1_asia.part_no, sales_q1_asia.country, sales_q1_asia.date, sales_q1_asia.amount) VALUES (20, 'q1_asia', 'INDIA', '2020-Mar-01', '650000');
This SELECT statement selects rows from a specific partition or subpartition of a sales table:
edb=# SELECT tableoid::regclass, * FROM sales PARTITION (q1_2020) AS q1_sales ORDER BY country;
tableoid | dept_no | part_no | country | date | amount -----------------+---------+-----------+---------+--------------------+-------- sales_q1_europe | 10 | q1_2020 | FRANCE | 01-FEB-20 00:00:00 | 500000 sales_q1_europe | 10 | q1_europe | FRANCE | 01-FEB-20 00:00:00 | 600000 sales_q1_asia | 20 | q1_asia | INDIA | 01-MAR-20 00:00:00 | 650000 (3 rows)
edb=# SELECT tableoid::regclass, * FROM sales SUBPARTITION (q1_europe) sales_q1_europe ORDER BY country;
tableoid | dept_no | part_no | country | date | amount -----------------+---------+-----------+---------+--------------------+-------- sales_q1_europe | 10 | q1_2020 | FRANCE | 01-FEB-20 00:00:00 | 500000 sales_q1_europe | 10 | q1_europe | FRANCE | 01-FEB-20 00:00:00 | 600000 (2 rows)
This UPDATE statement updates values in a partition or subpartition of the sales table:
edb=# UPDATE sales PARTITION (q1_2020) AS q1_sales SET q1_sales.amount = 10000 WHERE q1_sales.amount = 500000; UPDATE 1 edb=# UPDATE sales SUBPARTITION (q1_europe) sales_q1_europe SET sales_q1_europe.amount = 5000 WHERE sales_q1_europe.amount = 600000; UPDATE 1
This DELETE statement removes rows from the partition q1_2020 or subpartition q1_europe of the sales table:
edb=# DELETE FROM sales PARTITION (q1_2020) q1_sales WHERE q1_sales.amount = 10000; DELETE 1 edb=# DELETE FROM sales SUBPARTITION (q1_europe) AS sales_q1_europe WHERE sales_q1_europe.amount = 5000; DELETE 1