SQL> select t.table_name, t.partitioned, t.tablespace_name from user_tables t where table_name = 'SALES1';
TABLE_NAME PAR TABLESPACE_NAME
------------------------------ --- ------------------------------
SALES1 YES
SQL> select t.table_name, t.partition_name, t.tablespace_name from user_tab_partitions t where t.table_name = 'SALES1';
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
SALES1 SALES_Q1_2006 TS1
SALES1 SALES_Q2_2006 TS2
SALES1 SALES_Q3_2006 TS3
SALES1 SALES_Q4_2006 TS4
Reference-Partitioned用在主子表关系中,主表是分区表,字表与主表通过外键关联。这样子表的分区就依照主表的来建立,子表数据放到哪个分区也由主表相应记录的分区决定。
CREATE TABLE orders
( order_id NUMBER(12),
order_date DATE,
order_mode VARCHAR2(8),
customer_id NUMBER(6),
order_status NUMBER(2),
order_total NUMBER(8,2),
sales_rep_id NUMBER(6),
promotion_id NUMBER(6),
CONSTRAINT orders_pk PRIMARY KEY(order_id)
)
PARTITION BY RANGE(order_date)
( PARTITION Q1_2005 VALUES LESS THAN (TO_DATE('01-APR-2005','DD-MON-YYYY')),
PARTITION Q2_2005 VALUES LESS THAN (TO_DATE('01-JUL-2005','DD-MON-YYYY')),
PARTITION Q3_2005 VALUES LESS THAN (TO_DATE('01-OCT-2005','DD-MON-YYYY')),
PARTITION Q4_2005 VALUES LESS THAN (TO_DATE('01-JAN-2006','DD-MON-YYYY')) );
Table created.
SQL> CREATE TABLE order_items
( order_id NUMBER(12) NOT NULL,
line_item_id NUMBER(3) NOT NULL,
product_id NUMBER(6) NOT NULL,
unit_price NUMBER(8,2),
quantity NUMBER(8),
CONSTRAINT order_items_fk
FOREIGN KEY(order_id) REFERENCES orders(order_id)
)
PARTITION BY REFERENCE(order_items_fk);
Table created.
在主表插入第一、二季度的数据,然后在子表插入相应数据
SQL> insert into orders (order_id, order_date) values (1, to_date('2005-1-1', 'yyyy-mm-dd'));
1 row inserted
SQL> insert into orders (order_id, order_date) values (2, to_date('2005-6-1', 'yyyy-mm-dd'));
1 row inserted
SQL> commit;
Commit complete
SQL> insert into order_items values (1, 1, 1, 1, 1);
1 row inserted
SQL> insert into order_items values (2, 2, 2, 2, 2);
1 row inserted
SQL> commit;
Commit complete
此时查看主、子表的分区情况,发现子表数据插入了和主表相对应的分区中。
SQL>
SQL> select t.table_name,
2 t.partition_name,
3 t.tablespace_name,
4 t.segment_created,
5 t.initial_extent,
6 t.next_extent
7 from user_tab_partitions t
8 where t.table_name = 'ORDERS';
TABLE_NAME PARTITION_NAME TABLESPACE_NAME SEGMENT_CREATED INITIAL_EXTENT NEXT_EXTENT
------------------------------ ------------------------------ ------------------------------ --------------- -------------- -----------
ORDERS Q1_2005 USERS YES 8388608 1048576
ORDERS Q2_2005 USERS YES 8388608 1048576
ORDERS Q3_2005 USERS NO
ORDERS Q4_2005 USERS NO
SQL> select t.table_name,
2 t.partition_name,
3 t.tablespace_name,
4 t.segment_created,
5 t.initial_extent,
6 t.next_extent
7 from user_tab_partitions t
8 where t.table_name = 'ORDER_ITEMS';
TABLE_NAME PARTITION_NAME TABLESPACE_NAME SEGMENT_CREATED INITIAL_EXTENT NEXT_EXTENT
------------------------------ ------------------------------ ------------------------------ --------------- -------------- -----------
ORDER_ITEMS Q1_2005 USERS YES 8388608 1048576
ORDER_ITEMS Q2_2005 USERS YES 8388608 1048576
ORDER_ITEMS Q3_2005 USERS NO
ORDER_ITEMS Q4_2005 USERS NO
复合分区表
在范围分区下建立HASH分区。
其中一些范围分区单独指定了存储位置
CREATE TABLE emp1 (deptno NUMBER, empname VARCHAR(32), grade NUMBER)
PARTITION BY RANGE(deptno) SUBPARTITION BY HASH(empname)
SUBPARTITIONS 8 STORE IN (ts1, ts3, ts5, ts7)
(PARTITION p1 VALUES LESS THAN (1000),
PARTITION p2 VALUES LESS THAN (2000)
STORE IN (ts2, ts4, ts6, ts8),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
(SUBPARTITION p3_s1 TABLESPACE ts4,
SUBPARTITION p3_s2 TABLESPACE ts5));
插入测试数据
SQL> insert into emp1 values(1500, 'asd', 1);
1 row inserted
SQL> commit;
Commit complete
查看分区情况
主分区显示为USERS表空间,并没有创建,因为主分区只是逻辑存在。
SQL> select t.table_name,
2 t.partition_name,
3 t.tablespace_name,
4 t.segment_created,
5 t.initial_extent,
6 t.next_extent
7 from user_tab_partitions t
8 where t.table_name = 'EMP1';
TABLE_NAME PARTITION_NAME TABLESPACE_NAME SEGMENT_CREATED INITIAL_EXTENT NEXT_EXTENT
------------------------------ ------------------------------ ------------------------------ --------------- -------------- -----------
EMP1 P1 USERS NONE
EMP1 P2 USERS NONE
EMP1 P3 USERS NONE
子分区中,建表语句SUBPARTITIONS 8 STORE IN (ts1, ts3, ts5, ts7)处指定了8个子分区,因此子分区位于TS11335577。
P2的子分区位于临时指定的TS2,4,6,8。
P3的子分区位名字和数量都完全按具体指定的创建,分别位于TS2和TS5。
插入的数据位于P2的SYS_SUBP74分区
SQL> select t.table_name,
2 t.partition_name,
3 t.subpartition_name,
4 t.tablespace_name,
5 t.segment_created
6 from user_tab_subpartitions t
7 where t.table_name = 'EMP1'
8 order by t.partition_name, t.tablespace_name;
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME TABLESPACE_NAME SEGMENT_CREATED
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------
EMP1 P1 SYS_SUBP59 TS1 NO
EMP1 P1 SYS_SUBP63 TS1 NO
EMP1 P1 SYS_SUBP60 TS3 NO
EMP1 P1 SYS_SUBP64 TS3 NO
EMP1 P1 SYS_SUBP65 TS5 NO
EMP1 P1 SYS_SUBP61 TS5 NO
EMP1 P1 SYS_SUBP62 TS7 NO
EMP1 P1 SYS_SUBP66 TS7 NO
EMP1 P2 SYS_SUBP71 TS2 NO
EMP1 P2 SYS_SUBP67 TS2 NO
EMP1 P2 SYS_SUBP68 TS4 NO
EMP1 P2 SYS_SUBP72 TS4 NO
EMP1 P2 SYS_SUBP69 TS6 NO
EMP1 P2 SYS_SUBP73 TS6 NO
EMP1 P2 SYS_SUBP74 TS8 YES
EMP1 P2 SYS_SUBP70 TS8 NO
EMP1 P3 P3_S1 TS4 NO
EMP1 P3 P3_S2 TS5 NO
18 rows selected
给上面分区表创建局部索引
CREATE INDEX emp_ix ON emp1(deptno) LOCAL STORE IN (ts1, ts2, ts3);
和表象他,局部索引的主分区同样只是逻辑存在
SQL> select t.index_name,
2 t.partition_name,
3 t.tablespace_name,
4 t.segment_created
5 from user_ind_partitions t
6 where t.index_name = 'EMP_IX';
INDEX_NAME PARTITION_NAME TABLESPACE_NAME SEGMENT_CREATED
------------------------------ ------------------------------ ------------------------------ ---------------
EMP_IX P1 N/A
EMP_IX P2 N/A
EMP_IX P3 N/A
而局部索引的子分区出来存储位置被DDL语句指定意外,子分区的个数完全与表分区对应
SQL> select t.index_name,
2 t.partition_name,
3 t.subpartition_name,
4 t.tablespace_name,
5 t.segment_created
6 from user_ind_subpartitions t
7 order by t.partition_name, t.tablespace_name;
INDEX_NAME PARTITION_NAME SUBPARTITION_NAME TABLESPACE_NAME SEGMENT_CREATED
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------
EMP_IX P1 SYS_SUBP59 TS1 NO
EMP_IX P1 SYS_SUBP62 TS1 NO
EMP_IX P1 SYS_SUBP65 TS1 NO
EMP_IX P1 SYS_SUBP60 TS2 NO
EMP_IX P1 SYS_SUBP63 TS2 NO
EMP_IX P1 SYS_SUBP66 TS2 NO
EMP_IX P1 SYS_SUBP61 TS3 NO
EMP_IX P1 SYS_SUBP64 TS3 NO
EMP_IX P2 SYS_SUBP67 TS1 NO
EMP_IX P2 SYS_SUBP73 TS1 NO
EMP_IX P2 SYS_SUBP70 TS1 NO
EMP_IX P2 SYS_SUBP74 TS2 YES
EMP_IX P2 SYS_SUBP71 TS2 NO
EMP_IX P2 SYS_SUBP68 TS2 NO
EMP_IX P2 SYS_SUBP72 TS3 NO
EMP_IX P2 SYS_SUBP69 TS3 NO
EMP_IX P3 P3_S1 TS1 NO
EMP_IX P3 P3_S2 TS2 NO
18 rows selected