======================
(9i) LIST PARTITIONING
======================
PURPOSE
-------
Oracle 9i에서 처음 소개된 새로운 partition 방법인 LIST Partition을 소개한다.
Explanation
-----------
List partition은 몇개의 row가 partition에 map되어 있는지를 명시적으로 제어가
가능하도록 한다. 각각의 partition에 대해 별개의 partition key값을 가지고
나타낼수 있는데 이것은 range의 값을 가지고 partition하는 range partition과도
구별되며 hash fucntion에 따라 나누는 hash partition과는 구별된다.
List partition의 장점은 연관되지 않은 값들을 group화할 수 있는 점이다.
Table 뿐만 나니라 Index도 LIST partition방법으로 partition할 수 있다.
List partition의 제한은 다음과 같다.
- 오직 하나의 column만 key partition으로 가능하다.
- IOT는 List partition 할수 없다.
- 다른 partiton이나 같은 partition이라 할지라도 같은 값으로 partition
으로 partition할수 없다.
- RANGE partition에서 쓰이는 MAXVALUE로 List방법에는 bound을 줄수 없다.
SQL> col table_name format a15
SQL> col partition format a10
SQL> col high_value format a30
SQL> SELECT table_name, partition_name partition, high_value,
partition_position position
FROM user_tab_partitions
WHERE table_name='EMPLOYEES_REG_P'
order by position;
SQL> select table_name, PARTITIONING_TYPE, PARTITION_COUNT
from user_part_tables
where table_name = 'EMPLOYEES_REG_P';
TABLE_NAME PARTITIONING_TYPE PARTITION_COUNT
-------------------- -------------------- ---------------
EMPLOYEES_REG_P LIST 8
2. ( MODIFY a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Partition Key을 drop하기전에 partition key를 포함하는 row을 반드시
delete하여야 한다. 그렇지 않으면 아래와 같은 error을 만나게 되다.
ORA-14518: partition contains rows corresponding to values being dropped
SQL> Delete employees_reg_p WHERE region in ('R32', 'R22');
SQL> ALTER TABLE employees_reg_p modify partition zone_4
DROP values ('R22');
Table altered.
SQL> ALTER TABLE employees_reg_p modify partition zone_7
DROP values ('R32');
Table altered.
SQL> col table_name format a15
SQL> col partition format a10
SQL> col high_value format a30
SQL> SELECT table_name, partition_name partition, high_value,
partition_position position
FROM user_tab_partitions
WHERE table_name='EMPLOYEES_REG_P'
order by position;
특정 partition의 모든 값을 drop할수는 없다. 그 partition의 남은 마지막
값을 drop하고자 하면 아래와 같은 error가 날 것이다.
ORA-14317: cannot drop the last value of partition
3. ( ADD a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Partition key을 add하거나 partition을 add할수 있다.
SQL> ALTER TABLE employees_reg_p ADD partition ZONE_ADD
values ('R22', 'R32');
SQL> col table_name format a15
SQL> col partition format a10
SQL> col high_value format a30
SQL> SELECT table_name, partition_name partition, high_value,
partition_position position
FROM user_tab_partitions
WHERE table_name='EMPLOYEES_REG_P'
order by position;
SQL> ALTER TABLE employees_reg_p modify partition ZONE_ADD
DROP values ('R22');
Table altered.
SQL> ALTER TABLE employees_reg_p modify partition ZONE_4
ADD values ('R22');
Table altered.
SQL> SELECT table_name, partition_name partition, high_value,
partition_position position
FROM user_tab_partitions
WHERE table_name='EMPLOYEES_REG_P'
order by position;
4. ( MERGE List Partitions )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
두개의 partition을 merge할수 있으며, 순서를 줄 필요가 없기 때문에 range
partition처럼 근접한 값일 필요는 없다.
SQL> ALTER TABLE employees_reg_p merge partitions zone_add, zone_7 into
partition zone_7;
Table altered.
SQL> SELECT table_name, partition_name partition, high_value,
partition_position position
FROM user_tab_partitions
WHERE table_name='EMPLOYEES_REG_P'
order by position;
5. ( RENAME a List Partitions )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> ALTER TABLE employees_reg_p rename partition zone_7 to zone_merge;
Table altered.
SQL> SELECT table_name, partition_name partition, high_value,
partition_position position
FROM user_tab_partitions
WHERE table_name='EMPLOYEES_REG_P'
order by position;
6. ( SPLIT a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> ALTER TABLE employees_reg_p merge partitions zone_1, zone_3 into
partition zone_merge1_3;
Table altered.
SQL> SELECT table_name, partition_name partition, high_value,
partition_position position
FROM user_tab_partitions
WHERE table_name='EMPLOYEES_REG_P'
order by position;
SQL> ALTER TABLE employees_reg_p split partition ZONE_MERGE1_3
values ('R17', 'R18', 'R19', 'R2')
into ( partition ZONE_3, partition ZONE_1);
Table altered.
SQL> SELECT table_name, partition_name partition, high_value,
partition_position position
FROM user_tab_partitions
WHERE table_name='EMPLOYEES_REG_P'
order by position;
7. ( TRUNCATE a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> CREATE TABLE exchange_zone_3 as select * from employees_reg_p
where 1 = 2;
SQL> INSERT INTO exchange_zone_3 SELECT * FROM employees_reg_p PARTITION
(ZONE_3);
SQL> ALTER TABLE employees_reg_p TRUNCATE PARTITION ZONE_3 DROP STORAGE;
Table truncated.
8. ( EXCHANGE a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> ALTER TABLE employees_reg_p EXCHANGE PARTITION ZONE_3
WITH TABLE exchange_zone_3
WITHOUT VALIDATION;
Table altered.
9. (MOVE a List Partition)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> ALTER TABLE employees_reg_p MOVE PARTITION ZONE_3
TABLESPACE example;
SQL> col table_name format a15
SQL> col partition_name format a15
SQL> col tablespace_name format a10
SQL> select table_name,partition_name,tablespace_name,partition_position
from user_tab_partitions where table_name='EMPLOYEES_REG_P'
order by partition_position