Oracle 11g supports specifying a Virtual Column as the Partition Key.
A Virtual Column is a column where the value is derived on the basis of an expression on other columns or sql/plsql functions. The actual value is not stored in the block holding the row but is computed when the row is retrieved.
For example :
The MY_SALES_TABLE can be List, Range or Hash Partitioned on SALE_YEAR.
Thus, the SALE_YEAR value is not actually stored on disk, yet each partition has rows based on the SALE_YEAR (derived) value.
A Virtual Column is a column where the value is derived on the basis of an expression on other columns or sql/plsql functions. The actual value is not stored in the block holding the row but is computed when the row is retrieved.
For example :
create table my_sales_table
(invoice_id number primary key,
invoice_date date,
sale_year number(4) generated always as ( to_number(to_char(invoice_date,'YYYY')) ) virtual,
customer_id number,
sale_value number
)
/
insert into my_sales_table
(invoice_id, invoice_date, customer_id, sale_value)
values
(1,sysdate,100,10200)
/
select invoice_id, invoice_date, sale_year
from my_sales_table
/
INVOICE_ID INVOICE_DATE SALE_YEAR
1 28-NOV-18 2018
The MY_SALES_TABLE can be List, Range or Hash Partitioned on SALE_YEAR.
drop table my_sales_table; create table my_sales_table (invoice_id number primary key, invoice_date date, sale_year number(4) generated always as ( to_number(to_char(invoice_date,'YYYY')) ) virtual, customer_id number, sale_value number ) partition by list(sale_year) (partition p_2018 values (2018), partition p_2019 values (2019), partition p_2020 values (2020) ) / insert into my_sales_table (invoice_id, invoice_date, customer_id, sale_value) values (1,sysdate,100,10200) / select invoice_date, sale_year from my_sales_table partition (p_2018) / INVOICE_DATE SALE_YEAR 28-NOV-18 2018
Thus, the SALE_YEAR value is not actually stored on disk, yet each partition has rows based on the SALE_YEAR (derived) value.
No comments:
Post a Comment