05 July 2005

Partisi Table pada Oracle 9i

MANAGING TABEL BY PARTITIONING TABLE
Oracle 8i (recomended 9i)

Manfaat dari penggunaan Partitioning Table pada Oracle Database
adalah sebagai berikut :
[1]. Data dalam jumlah besar dapat disimpan secara terpisah berdasarkan
kolom tertentu yang disebut sebagai "PARTITION KEY".
[2]. Pencarian Data dapat dilakukan menggunakan partisi tertentu
sehingga tidak perlu membaca semua block pada table yang sudah terpartisi.

Ada berberapa macam jenis Partition Table antara lain :

1. Partition Table by Range
Membuat Partisi berdasarkan Range data tertentu,
misal berdasarkan data dari bulan januari sampai dengan desember, atau
Mempartisi data menurut interval atau kisaran dari nilai ‘partition key’
yaitu kolom yang digunakan sebagai acuan pembuatan partisi.

2. Partition Table by List
Membuat Partisi berdasarkan Range data tertentu,
misal berdasarkan wilayah atau kota
(hint: jenis partisi ini hanya terdapat pada Oracle v.9i keatas)

3. Partition Table by Hash
Metode partisi ini digunakan jika tidak mengetahui range data secara pasti,
cukup menyebutkan berapa akan partisi dan yang membuat partisinya
adalah Oracle sendiri. Dengan kata lain partisi yang dilakukan sesuai dengan
Oracle Formula dan user tidak perlu tahu.
Partisi hash menggunakan fungsi HASH untuk kolom terpartisi
dan memungkinkan penyebaran data secara merata pada sejumlah partisi
karena row yang dipetakan ke suatu partisi didasarkan pada nilai hash dari partition key.
Sebaiknya tetapkan jumlah partisi sebagai kelipatan 2,4,6,8, dst.

4. Partition Composite (partisi gabungan)
Membuat Partisi tabel dengan menggunakan gabungan dari partisi
Range dan List, atau Range dan Hash.


Demo Impmenetasi keemapat metode partisi tabel:

1. PARTITION BY RANGE (v 8i, support)
Membuat Table P_RANGE,
dengan implementasi PARTITIONING By RANGE

CREATE TABLE P_RANGE (
ID CHAR(4),
TANGGAL DATE,
NAMA_BARANG VARCHAR2(20),
QTY NUMBER
) PARTITION BY RANGE (TANGGAL) (
PARTITION PART_2000 VALUES LESS THAN (TO_DATE('01012001','DDMMYYYY')),
PARTITION PART_2001 VALUES LESS THAN (TO_DATE('01012002','DDMMYYYY')),
PARTITION PART_2002 VALUES LESS THAN (TO_DATE('01012003','DDMMYYYY')),
PARTITION PART_2003 VALUES LESS THAN (TO_DATE('01012004','DDMMYYYY')),
PARTITION PART_2004 VALUES LESS THAN (TO_DATE('01012005','DDMMYYYY'))
) ENABLE ROW MOVEMENT;

Dengan penambahan klausa ‘ENABLE ROW MOVEMENT’,
maka perpindahan data pada partisi yang berbeda ketika melakukan
update pada tanggal yang merupakan ‘PARTITION KEY’ bisa dilakukan.

Menambah Partisi baru dengan nama PMAX untuk menampung nilai tertinggi
yang tidak bisa ditampung oleh partisi-partisi yang sudah ada (melebihi kapasitas)

SQL> ALTER TABLE P_RANGE
2 ADD PARTITION PMAX VALUES LESS THAN (MAXVALUE);
Table altered

Menghapus partisi PMAX

SQL> ALTER TABLE P_RANGE
2 DROP PARTITION PMAX;
Table altered

Menambah Partisi baru dengan untuk TAHUN 2005

SQL> ALTER TABLE P_RANGE
2 ADD PARTITION PART_2005
3 VALUES LESS THAN (TO_DATE('01012006','DDMMYYYY'));
Table altered

Memisahkan/membagi sebuah Partisi 2 bagian (2 buah partisi)
menggunakan keyword “SPLIT PARTITION”.
Misal dari partisi yang sudah ditambahkan diatas P2005 (partisi untuk tahun 2005)
akan dibagi menjadi 2 yakni periode_1 (sampai dengan tanggal 01-Agustus-2005)
dan periode_2 (sampai dengan tanggal 01-jan-2006).

SQL> ALTER TABLE P_RANGE
2 SPLIT PARTITION PART_2005 AT (TO_DATE('01072005','DDMMYYYY'))
3 INTO (
4 PARTITION PERIODE_1,
5 PARTITION PERIODE_2
6 );
Table altered

Hasil dari penambahan partisi dengan cara SPLIT PARTITION,
pada table P_RANGE akan terlihat seperti berikut:

SQL> SELECT PARTITION_POSITION NO, PARTITION_NAME PNAME,
2 SUBPARTITION_COUNT, AVG_SPACE, BLOCKS, EMPTY_BLOCKS
3 FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='P_RANGE' ORDER BY NO;

NO PNAME SUBPARTITION_COUNT AVG_SPACE BLOCKS EMPTY_BLOCKS
---------- ---------- ------------------ ---------- ---------- ------------
1 PART_2000 0 8035 1 14
2 PART_2001 0 8065 1 14
3 PART_2002 0 8071 1 14
4 PART_2003 0 8067 1 14
5 PART_2004 0 0 0 15
6 PERIODE_1 0 0 0 15
7 PERIODE_2 0 0 0 15

7 rows selected

Menggabungkan 2 buah partisi dalam tabel P_RANGE.
Misal menggabungkan partisi PART_2000 dan PART_2001

SQL> ALTER TABLE P_RANGE
2 MERGE PARTITIONS PART_2000, PART_2001
3 INTO PARTITION PART_2001_2002;
Table altered

Hasil dari penggabungan partisi dengan cara MERGE PARTITION,
pada table P_RANGE akan terlihat seperti berikut:

SQL> SELECT PARTITION_POSITION NO, PARTITION_NAME PNAME,
2 SUBPARTITION_COUNT, AVG_SPACE, BLOCKS, EMPTY_BLOCKS
3 FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='P_RANGE' ORDER BY NO;

NO PNAME SUBPARTITION_COUNT AVG_SPACE BLOCKS EMPTY_BLOCKS
---------- --------------- ------------------ ---------- ---------- ------------
1 PART_2001_2002 0 7998 1 14
2 PART_2002 0 8071 1 14
3 PART_2003 0 8067 1 14
4 PART_2004 0 0 0 15
5 PERIODE_1 0 0 0 15
6 PERIODE_2 0 0 0 15

6 rows selected

2. PARTITION BY LIST (v. 8i, tidak support)
Membuat tabel P_LIST, dengan implementasi PARTITION BY LIST
dan list yang digunakan sebagai data untuk dipartisi adalah field “NAMAKOTA”.

CREATE TABLE P_LIST (
ID NUMBER(4),
NO_BUKTI CHAR(4),
NAMABARANG VARCHAR2(20),
NAMAKOTA VARCHAR2(20),
QTY NUMBER
) PARTITION BY LIST (NAMAKOTA) (
PARTITION KOTA1 VALUES(‘Surabaya’),
PARTITION KOTA1 VALUES(‘Bandung’),
PARTITION KOTA1 VALUES(‘Jakarta’),
) ENABLE ROW MOVEMENT;

Catatan:
Untuk Partition by LIST, hampir sama dengan Partition by RANGE
dalam menambah partisi, modifikasi partisi, hapus paritisi, etc.
Namun metode Partisi by LIST ini tidak terdapat pada Oracle
dengan versi 8i kebawah (hanya terdapat pada Oracle versi 9i keatas).

Sedang untuk operasi penambahan, penghapusan, pembagian/pemisahan,
dan penggabungan partisi dalam satu table sama dengan pembahasan
diatas pada Partisi by Range.

3. PARTITION BY HASH (v.8i, support)
Membuat tabel P_HASH, dengan implementasi PARTITION BY HASH

CREATE TABLE P_HASH (
KODE NUMBER,
NAMA VARCHAR2(20)
) PARTITION BY HASH (NAMA) PARTITIONS 4;

Penamaan partisi oleh Oracle dengan SYS_n

SQL> SELECT PARTITION_POSITION NO, PARTITION_NAME P_NAME,
2 BLOCKS, EMPTY_BLOCKS, NUM_ROWS "#ROWS"
3 FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='P_HASH';

NO P_NAME BLOCKS EMPTY_BLOCKS #ROWS
---------- ------------------------------ ---------- ------------ ----------
1 SYS_P7 0 15 0
2 SYS_P8 0 15 0
3 SYS_P9 0 15 0
4 SYS_P10 0 15 0

Jenis metode partisi HASH, bisa diterapkan pada Oracle Database Server
dengan media penyimpanan menggunakan RAID untuk memoptimalkan LOAD BALANCING.
Dimana Oracle akan membagai data-data yang diinputkan (meletakkan secara seimbang)
sesuai dengan kolom yang dipartisi menggunakan metode HASH.

Pada saat membuat tabel dengan metoda parition HASH,
pembagian partisi juga bisa langsung ditempatkan pada
tablespace yang berbeda, berikut contoh pembuatannya.

CREATE TABLE P_HASH1 (
KODE NUMBER,
NAMA VARCHAR2(20)
) PARTITION BY HASH (NAMA) PARTITIONS 4
STORE IN (TSPACE1, TSPACE2, TSPACE3, TSPACE4);

Catatan:
Untuk operasi penambahan, penghapusan, pembagian/pemisahan,
dan penggabungan partisi dalam satu table sama dengan
pembahasan diatas pada Partisi by Range.

4. PARTITION COMPOSITE
Membuat tabel P_COMPOSITE, dengan implementasi metode
partisi gabungan (composite) dari metode RANGE dan HASH

CREATE TABLE P_COMPOSITE (
KODE NUMBER(5),
TGL DATE,
NAMA_PRODUK VARCHAR2(25),
QTY NUMBER
) PARTITION BY RANGE (TGL)
SUBPARTITION BY HASH (NAMA_PRODUK) SUBPARTITIONS 3 (
PARTITION TH2000 VALUES LESS THAN (TO_DATE('01012001','DDMMYYYY')) (
SUBPARTITION PROD_A,
SUBPARTITION PROD_B,
SUBPARTITION PROD_C
),
PARTITION TH2001 VALUES LESS THAN (TO_DATE('01012002','DDMMYYYY')) (
SUBPARTITION PROD_D,
SUBPARTITION PROD_E,
SUBPARTITION PROD_F
),
PARTITION TH2002 VALUES LESS THAN (TO_DATE('01012003','DDMMYYYY')) (
SUBPARTITION PROD_G,
SUBPARTITION PROD_H,
SUBPARTITION PROD_I
)
) ENABLE ROW MOVEMENT;


Melihat deskripsi tabel P_COMPOSITE, yang dipartisi dengan
metode Partisi Composite (Gabungan) RANGE dan HASH.

SQL> SELECT PARTITION_POSITION NO, PARTITION_NAME P_NAME,
2 SUBPARTITION_COUNT SUB_COUNT, BLOCKS, EMPTY_BLOCKS,NUM_ROWS "#ROWS"
3 FROM USER_TAB_PARTITIONS
4 WHERE TABLE_NAME='P_COMPOSITE';

NO P_NAME SUB_COUNT BLOCKS EMPTY_BLOCKS #ROWS
---- -------------- ---------- ---------- ------------ ----------
1 TH2000 3 0 45 0
2 TH2001 3 0 45 0
3 TH2002 3 0 45 0

Kolom SUB_COUNT, merupakan jumlah subpartisi dari masing-masing partisi.

MENGAKTIFKAN AUTOTRACE

Sebagai tambah untuk menganalisa dan melihat performa query
gunakan AUTOTRACE. Untuk menggunakan tool ini di Oracle harus
di set terlebih dahulu, berikut langkah-langkah mengaktifkan
tool autotace:

[1]. Langkah pertama, lakukan koneksi sebagai SYS ATAU SYSTEM as SYSDBA
SQL> CONN SYSTEM/MANAGER@DB8I
Connected.

[2]. Jalankan script SQL, yang sudah tersedia pada Oracle yakni 'utlxplan.sql'
SQL> @?\rdbms\admin\utlxplan.sql
Table created.

[3]. Buat sebuah synonym yang nantinya bisa dipakai oleh semua user (public)
SQL> create public synonym plan_table for plan_table;

[4]. Jalankan lagi script SQL, yang ada pada Oracle yakni 'plustrace.sql'
SQL> @?\sqlplus\admin\plustrce.sql

[5]. Beri Grant pada plus trace agar bisa diakses oleh semua user (public)
SQL> grant plustrace to public;
Grant succeeded.

Semoga bermanfaat.

Didokumentasikan oleh Zainal Abidin
pada tanggal 03 Juli 2005 jam 22:36:41

Mari Perbanyak Bersyukur

Damn! setelah sekian lama gak ketemu dan share dgn Paman di Jojoran semalem akhir-nya bisa terlaksana, masih dalam kehangatan lebaran. Dari ...