Oracle12C新特性—只讀分割槽,外部表分割槽,多列分割槽
Oracle12.2資料庫版本增加了:只讀分割槽 ;外部表分割槽 和 多列分割槽的新特性
官方文件:
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/vldbg/partition-create-tables-indexes.html#GUID-24050391-B7C5-4AE2-86D4-B5438412C3F6
1、只讀分割槽或子分割槽
在Oracle12.2資料庫中可以將表,分割槽和子分割槽設定為只讀狀態,以保護資料免受任何使用者或觸發器的無意DML操作。
只讀子句的值可以是READ ONLY或READ WRITE。READ WRITE是預設值。除非為分割槽或子分割槽顯式設定了只讀子句,否則只讀子句的更高級別設定將應用於分割槽和子分割槽!
例子:建立具有隻讀和讀寫分割槽的表:orders_read_write_only
以下是建立具有隻讀和讀寫狀態的複合範圍列表分割槽表的示例。將orders_read_write_only被明確指定為READ WRITE,所以表的預設屬性是讀寫。partition的預設屬性order_p1被指定為只讀,因此子分割槽ord_p1_northwest和order_p1_southwest從分割槽繼承只讀狀態order_p1。子分割槽ord_p2_southwest和order_p3_northwest顯式指定為只讀,覆蓋預設讀寫狀態。
CREATE TABLE orders_read_write_only ( order_id NUMBER (12), order_date DATE CONSTRAINT order_date_nn NOT NULL, state VARCHAR2(2) ) READ WRITE PARTITION BY RANGE (order_date) SUBPARTITION BY LIST (state) ( PARTITION order_p1 VALUES LESS THAN (TO_DATE ('01-DEC-2015','DD-MON-YYYY')) READ ONLY ( SUBPARTITION order_p1_northwest VALUES ('OR', 'WA'), SUBPARTITION order_p1_southwest VALUES ('AZ', 'UT', 'NM')), PARTITION order_p2 VALUES LESS THAN (TO_DATE ('01-MAR-2016','DD-MON-YYYY')) ( SUBPARTITION order_p2_northwest VALUES ('OR', 'WA'), SUBPARTITION order_p2_southwest VALUES ('AZ', 'UT', 'NM') READ ONLY), PARTITION order_p3 VALUES LESS THAN (TO_DATE ('01-JUL-2016','DD-MON-YYYY')) (SUBPARTITION order_p3_northwest VALUES ('OR', 'WA') READ ONLY, SUBPARTITION order_p3_southwest VALUES ('AZ', 'UT', 'NM')) );
--檢查分割槽和子分割槽的狀態:
SQL> SELECT PARTITION_NAME, READ_ONLY FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='ORDERS_READ_WRITE_ONLY'; PARTITION_NAME READ ------------------------- ---- ORDER_P1 YES ---只讀狀態 ORDER_P2 NONE ORDER_P3 NONE SQL> set linesize 300 SQL> col PARTITION_NAME for a25 SQL> col SUBPARTITION_NAME for a25 SQL> SELECT PARTITION_NAME, SUBPARTITION_NAME, READ_ONLY FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME ='ORDERS_READ_WRITE_ONLY'; PARTITION_NAME SUBPARTITION_NAME REA ------------------------- ------------------------- --- ORDER_P1 ORDER_P1_NORTHWEST YES ORDER_P1 ORDER_P1_SOUTHWEST YES ORDER_P2 ORDER_P2_NORTHWEST NO ORDER_P2 ORDER_P2_SOUTHWEST YES ORDER_P3 ORDER_P3_NORTHWEST YES ORDER_P3 ORDER_P3_SOUTHWEST NO 6 rows selected.
(從上面可以看出,如果單獨設定子分割槽為只讀狀態 會覆蓋分割槽的讀寫屬性,也就是說對一個分割槽的子分割槽進行設定只讀狀態 不會影響這個分割槽下的其他子分割槽的屬性!)
--:分割槽的屬性可以通過modify語句進行線上修改。
SQL> alter table ORDERS_READ_WRITE_ONLY modify partition ORDER_P1 read write;
################################################################
2、建立 外部表分割槽:
在12.2中,Oracle還支援外部表分割槽,類似如下的語法展示了這一特性的用途,對於一個統一的外部表,可以通過分割槽指向不同的外部檔案,不同檔案可以用於儲存已經分類的資料,從而更加靈活的使用外部表:
例子:
SQL> Create directory load_d1 as '/home/oracle'; CREATE TABLE sales (loc_id number, prod_id number, cust_id number, amount_sold number, quantity_sold number) ORGANIZATION EXTERNAL (TYPE oracle_loader DEFAULT DIRECTORY load_d1 ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII NOBADFILE LOGFILE log_dir:'sales.log' FIELDS TERMINATED BY "," ) ) REJECT LIMIT UNLIMITED PARTITION BY RANGE (loc_id) (PARTITION p1 VALUES LESS THAN (1000) LOCATION ('california.txt'), PARTITION p2 VALUES LESS THAN (2000) DEFAULT DIRECTORY load_d2 LOCATION ('washington.txt'), PARTITION p3 VALUES LESS THAN (3000));
###########################################################
3、列表分割槽:
建立列表分割槽的語義與建立範圍分割槽的語義非常相似。從Oracle12.2開始可以建立多列列表分割槽。
例子:建立列表分割槽
CREATE TABLE q1_sales_by_region (deptno number, deptname varchar2(20), quarterly_sales number(10, 2), state varchar2(2)) PARTITION BY LIST (state) (PARTITION q1_northwest VALUES ('OR', 'WA'), PARTITION q1_southwest VALUES ('AZ', 'UT', 'NM'), PARTITION q1_northeast VALUES ('NY', 'VM', 'NJ'), PARTITION q1_southeast VALUES ('FL', 'GA'), PARTITION q1_northcentral VALUES ('SD', 'WI'), PARTITION q1_southcentral VALUES ('OK', 'TX'));
3.1、、使用預設分割槽建立列表分割槽:(指定預設分割槽就是將不符合的行都插入到預設分割槽中)
與範圍分割槽不同,使用列表分割槽,分割槽之間沒有明顯的順序感。
您還可以指定一個預設分割槽,將未對映到任何其他分割槽的行對映到該分割槽。如果在前面的示例中指定了預設分割槽,則狀態CA將對映到該分割槽。
例子:使用預設分割槽建立列表分割槽表
CREATE TABLE sales_by_region (item# INTEGER, qty INTEGER, store_name VARCHAR(30), state_code VARCHAR(2),sale_date DATE) STORAGE(INITIAL 10K NEXT 20K) TABLESPACE tbs5 PARTITION BY LIST (state_code) (PARTITION region_east VALUES ('MA','NY','CT','NH','ME','MD','VA','PA','NJ') STORAGE (INITIAL 8M) TABLESPACE tbs8, PARTITION region_west VALUES ('CA','AZ','NM','OR','WA','UT','NV','CO') NOLOGGING, PARTITION region_south VALUES ('TX','KY','TN','LA','MS','AR','AL','GA'), PARTITION region_central VALUES ('OH','ND','SD','MO','IL','MI','IA'), PARTITION region_null VALUES (NULL), PARTITION region_unknown VALUES (DEFAULT));
3.2、建立自動列表分割槽:
自動列表分割槽方法允許按需建立列表分割槽。
自動列表分割槽表類似於常規列表分割槽表,但該分割槽表更易於管理。您可以僅使用已知的分割槽鍵值建立自動列表分割槽表。當資料載入到表中時,如果載入的分割槽鍵值與任何現有分割槽不對應,則資料庫會自動建立新分割槽。由於分割槽是按需自動建立的,因此自動列表分割槽方法在概念上與現有的間隔分割槽方法類似。
注意:
①:除非您可以調整資料,否則對值非常頻繁更改的資料型別的自動列表分割槽不太適合此方法。
②:自動列表分割槽表在建立時必須至少有一個分割槽。由於為新的和未知的分割槽鍵值自動建立了新分割槽,因此自動列表分割槽不能具有DEFAULT分割槽。
例子:
CREATE TABLE sales_auto_list ( salesman_id NUMBER(5), salesman_name VARCHAR2(30), sales_state VARCHAR2(20), sales_amount NUMBER(10), sales_date DATE) PARTITION BY LIST (sales_state) AUTOMATIC (PARTITION P_CAL VALUES ('CALIFORNIA') );
--檢視列表分割槽是否為自動列表分割槽
SQL> col TABLE_NAME for a20 SQL> col owner for a10 SQL> set linesize 300 SQL> select OWNER,TABLE_NAME,PARTITIONING_TYPE,AUTOLIST from dba_PART_TABLES where table_name=upper('sales_auto_list'); OWNER TABLE_NAME PARTITION AUT ---------- -------------------- --------- --- SYS SALES_AUTO_LIST LIST YES
3.3、建立多列列表分割槽:
與單列列表分割槽類似,各個分割槽可以包含包含值列表的集合。
語法:PARTITION BY LIST (column1,column2)
例子:建立多列列表分割槽
CREATE TABLE dba_by_db_in_yhem (dbalic NUMBER, username VARCHAR2(20), dbcat VARCHAR2(4), region VARCHAR2(10) ) PARTITION BY LIST (dbcat, region) ( PARTITION north_part VALUES (('ORCL','BEIJING'), ('ORCL','TIANJIN')), PARTITION south_part VALUES (('DB2','SHENZHEN'), ('DB2','GUANGZHOU')), PARTITION west_part VALUES (('SQL','CHENGDU'),('ORCL','CHENGDU'),('DB2','KUNMING')), PARTITION east_part VALUES ('ORCL','SHANGHAI'), PARTITION rest VALUES (DEFAULT) ); insert into dba_by_db_in_yhem values(1,'EYGLE','ORCL','BEIJING'); insert into dba_by_db_in_yhem values(2,'KAMUS','ORCL','BEIJING'); insert into dba_by_db_in_yhem values(3,'LAOXIONG','SQL','CHENGDU'); insert into dba_by_db_in_yhem values(4,'ORA-600','DB2','GUANGZHOU'); insert into dba_by_db_in_yhem values(5,'YANGTINGKUN','ALL','BEIJING'); SQL> select * from dba_by_db_in_yhem partition (north_part); DBALIC USERNAME DBCA REGION ---------- -------------------- ---- ---------- 1 EYGLE ORCL BEIJING 2 KAMUS ORCL BEIJING SQL> select * from dba_by_db_in_yhem partition (south_part); DBALIC USERNAME DBCA REGION ---------- -------------------- ---- ---------- 4 ORA-600 DB2 GUANGZHOU
####################################################
指定祕鑰列的分割槽:
對於範圍分割槽和雜湊分割槽表,最多可以指定16個分割槽鍵列。
1、按日期建立多列範圍分割槽表
CREATE TABLE sales_demo ( year NUMBER, month NUMBER, day NUMBER, amount_sold NUMBER) PARTITION BY RANGE (year,month) (PARTITION before2001 VALUES LESS THAN (2001,1), PARTITION q1_2001 VALUES LESS THAN (2001,4), PARTITION q2_2001 VALUES LESS THAN (2001,7), PARTITION q3_2001 VALUES LESS THAN (2001,10), PARTITION q4_2001 VALUES LESS THAN (2002,1), PARTITION future VALUES LESS THAN (MAXVALUE,0)); INSERT INTO sales_demo VALUES(2000,12,12, 1000); INSERT INTO sales_demo VALUES(2001,3,17, 2000); INSERT INTO sales_demo VALUES(2001,11,1, 5000); INSERT INTO sales_demo VALUES(2002,1,1, 4000);
2、建立多列範圍分割槽表(強制實施相等的分割槽)
CREATE TABLE supplier_parts ( supplier_id NUMBER, partnum NUMBER, price NUMBER) PARTITION BY RANGE (supplier_id, partnum) (PARTITION p1 VALUES LESS THAN (10,100), PARTITION p2 VALUES LESS THAN (10,200), PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)); INSERT INTO supplier_parts VALUES(5,5,1000); INSERT INTO supplier_parts VALUES(5,150,1000); INSERT INTO supplier_parts VALUES(10,100,1000); --檢視各分割槽的值: SQL> SELECT * FROM supplier_parts PARTITION (p1); SUPPLIER_ID PARTNUM PRICE ----------- ---------- ---------- 5 5 1000 5 150 1000 SQL> SELECT * FROM supplier_parts PARTITION (p2); SUPPLIER_ID PARTNUM PRICE ----------- ---------- ---------- 10 100 1000