Jumat, 15 Agustus 2008

Partitioning Table: Definisi dan Contoh

Partitioning Table: Definisi dan Contoh


Filosofi partisi adalah memecah tabel ke dalam beberapa segment (partisi atau subpartisi), di mana tabel konvensional hanya mempunyai satu segment.

Misalkan kita punya tabel PENJUALAN dengan 8 juta records, kita ingin query data untuk quartal pertama tahun ini. Pada tabel konvensional (non partition), query akan men-scan keseluruhan 8 juta records data tersebut karena berada dalam 1 segment. Nah, kalau tabel itu dipartisi (by range untuk kolom tanggal penjualan) maka query akan men-scan khusus segment di mana data itu berada; tidak semua 8 juta records data itu di-scan, sehingga proses query lebih cepat.

Manfaat lain dari partitioning adalah tiap-tiap segment (partisi atau subpartisi) bisa ditaruh di tablespace yang berbeda, sehingga kita mendapat manfaat dari spreading (menyebar) tablespace, yaitu penyebaran I/O dan mengurangi resiko loss data karena tablespace corrupt.

Ada 3 metode utama partisi, dan ada 2 macam composite (gabungan):

Range partitioning
List partitioning
Hash partitioning
Composite range-list partitioning
Composite range-hash partitioning
Misalkan saya punya tabel penjualan yang punya kolom no_invoice, tgl_jual, dan area.

CREATE TABLE penjualan
( no_invoice NUMBER,
tgl_jual DATE,
area varchar2(10));Dalam artikel ini saya juga akan memberi contoh macam-macam partisi yang bisa dilakukan pada tabel penjualan tersebut.

Range Partition

Pada range partition, data dikelompokkan berdasarkan range (rentang) nilai yang kita tentukan. Range partition ini cocok digunakan pada kolom yang nilainya terdistribusi secara merata. Contoh yang paling sering adalah kolom tanggal.

Berikut ini contoh membuat table PENJUALAN dengan partisi range pada kolom tgl_jual (untuk menegaskan bahwa ini adalah contoh range partition, tabel saya beri nama PENJUALAN_RANGE):

CREATE TABLE penjualan_range
( no_invoice NUMBER,
tgl_jual DATE NOT NULL,
area varchar2(10))
PARTITION BY RANGE (tgl_jual)
(
PARTITION jual_kw1 VALUES LESS THAN (TO_DATE('01-APR-2008','DD-MON-YYYY')) TABLESPACE users,
PARTITION jual_kw2 VALUES LESS THAN (TO_DATE('01-JUL-2008','DD-MON-YYYY')) TABLESPACE users,
PARTITION jual_kw3 VALUES LESS THAN (TO_DATE('01-OCT-2008','DD-MON-YYYY')) TABLESPACE users,
PARTITION jual_kw4 VALUES LESS THAN (TO_DATE('01-JAN-2009','DD-MON-YYYY')) TABLESPACE users
);Dalam contoh di atas, spesifikasi tablespace ada pada tiap segment (partisi). Yang seperti ini (spesifikasi tablespace pada tiap segment) biasanya dilakukan kalau tiap segment (partisi) ditempatkan pada tablespace yang berbeda. Karena keterbatasan tablespace, dalam contoh ini saya taruh dalam satu tablespace yang sama, yaitu tablespace USERS.

List Partition

Pada list partition, data dikelompokkan berdasarkan nilainya. Cocok untuk kolom yang variasi nilainya tidak banyak. Saya masih menggunakan contoh table penjualan. Yang cocok dengan list partition adalah kolom area.

Berikut ini contoh membuat table PENJUALAN dengan partisi list pada kolom area (untuk membedakan dengan contoh range partition, tabel saya beri nama PENJUALAN_LIST):

CREATE TABLE penjualan_list
( no_invoice NUMBER,
tgl_jual DATE NOT NULL,
area varchar2(10))
PARTITION BY LIST (area)
(
PARTITION daerah_barat VALUES ('JAKARTA','MEDAN','BANDUNG') ,
PARTITION daerah_timur VALUES ('SEMARANG','SURABAYA','MAKASAR')
) TABLESPACE users;Definisi tablespace bisa didefinisikan di level partisi ataupun tabel. Dalam contoh di atas, karena semua partisi ditaruh di tablespace yang sama, maka definisi tablespace cukup ditaruh di definisi tabel (tidak perlu di tiap partisi).

Hash Partition

Jika kita ingin melakukan partisisi namun tidak cocok dengan RANGE ataupun LIST, maka kita bisa menggunakan HASH partition. Penentuan “nilai mana di taruh di partisi mana” itu diatur secara internal oleh Oracle (berdasarkan hash value).

Kenapa kita memaksakan memakai partisi sementara tidak cocok dengan RANGE ataupun LIST? Lha, ya itu tadi, kita ingin mendapat manfaat dari filosofi PARTITIONING di mana data disebar ke segment-segment yang berbeda.

Untuk tabel penjualan, kolom yang cocok dengan HASH partitioning adalah kolom no_invoice. Berikut ini contohnya (tabel saya beri nama PENJUALAN_HASH):

CREATE TABLE penjualan_hash
( no_invoice NUMBER,
tgl_jual DATE NOT NULL,
area varchar2(10))
PARTITION BY HASH (no_invoice)
PARTITIONS 4 tablespace users;Secara otomatis Oracle akan membuat 4 partisi (sesuai dengan nilai dari parameter PARTITIONS). Dalam contoh di atas, definisi tablespace ditaruh di definisi tabel, yang berarti semua partisi (segment) di taruh di tablespace yang sama (tablespace USERS).

Kita bisa menaruh definisi tablespace di tiap partisi bila kita ingin tiap partisi (segment) disimpan di tablespace yang berbeda. Karena keterbatasan tablespace, dalam contoh ini semua partisi ditaruh di tablespace Users:

CREATE TABLE penjualan_hash
( no_invoice NUMBER,
tgl_jual DATE NOT NULL,
area varchar2(10))
PARTITION BY HASH (no_invoice)
PARTITIONS 4 STORE IN (users, users, users, users);Composite range-list partition

Dengan karakteristik yang seperti itu, tabel PENJUALAN bisa kita partisi pada kolom TGL_JUAL dan AREA. Berikut ini contohnya (untuk membedakan dengan contoh-contoh sebelumnya, tabel saya beri nama PENJUALAN_RANGE_LIST):

CREATE TABLE PENJUALAN_RANGE_LIST
( no_invoice NUMBER,
tgl_jual DATE NOT NULL,
area varchar2(10))
PARTITION BY RANGE (tgl_jual)
SUBPARTITION BY LIST (area)
(
PARTITION jual_kw1 VALUES LESS THAN (TO_DATE('01-APR-2008','DD-MON-YYYY')) TABLESPACE users
(SUBPARTITION kw1_barat VALUES ('JAKARTA','MEDAN','BANDUNG'),
SUBPARTITION kw1_timur VALUES ('SEMARANG','SURABAYA','MAKASAR')
),
PARTITION jual_kw2 VALUES LESS THAN (TO_DATE('01-JUL-2008','DD-MON-YYYY')) TABLESPACE users
(SUBPARTITION kw2_barat VALUES ('JAKARTA','MEDAN','BANDUNG'),
SUBPARTITION kw2_timur VALUES ('SEMARANG','SURABAYA','MAKASAR')
),
PARTITION jual_kw3 VALUES LESS THAN (TO_DATE('01-OCT-2008','DD-MON-YYYY')) TABLESPACE users
(SUBPARTITION kw3_barat VALUES ('JAKARTA','MEDAN','BANDUNG'),
SUBPARTITION kw3_timur VALUES ('SEMARANG','SURABAYA','MAKASAR')
),
PARTITION jual_kw4 VALUES LESS THAN (TO_DATE('01-JAN-2009','DD-MON-YYYY'))
(SUBPARTITION kw4_barat VALUES ('JAKARTA','MEDAN','BANDUNG') TABLESPACE users ,
SUBPARTITION kw4_timur VALUES ('SEMARANG','SURABAYA','MAKASAR') TABLESPACE users
)
);Dalam contoh di atas, definisi tablespace ada yang di level PARTISI dan ada yang level di SUBPARTISI.

Composite range-hash partition

Kitapun bisa mempartisi tabel PENJUALAN pada kolom TGL_JUAL dan NO_INVOICE. Berikut ini contohnya (untuk membedakan dengan contoh-contoh sebelumnya, tabel saya beri nama PENJUALAN_RANGE_HASH):

CREATE TABLE penjualan_range_hash
( no_invoice NUMBER,
tgl_jual DATE NOT NULL,
area varchar2(10))
PARTITION BY RANGE (tgl_jual)
SUBPARTITION BY HASH (no_invoice)
SUBPARTITIONS 4 STORE IN (users, users, users, users)
(
PARTITION jual_kw1 VALUES LESS THAN (TO_DATE('01-APR-2008','DD-MON-YYYY')),
PARTITION jual_kw2 VALUES LESS THAN (TO_DATE('01-JUL-2008','DD-MON-YYYY')),
PARTITION jual_kw3 VALUES LESS THAN (TO_DATE('01-OCT-2008','DD-MON-YYYY')),
PARTITION jual_kw4 VALUES LESS THAN (TO_DATE('01-JAN-2009','DD-MON-YYYY'))
);Urutan tablespace
Berikut ini hirarki untuk alokasi tablespace:

Kalau di definisi SUBPARTITION tidak disebutkan tablespacenya, maka SUBPARTITION akan ditaruh di tablespace yang didefinisikan di PARTITION.
Kalau di definisi PARTITION tidak disebutkan tablespacenya, maka PARTITION akan ditaruh di tablespace yang didefinisikan di TABLE
Kalau tablespacenya tidak disebutkan (baik di level SUPPARTITION, PARTITION, maupun TABLE) maka, semua segment (baik SUPPARTITION maupun PARTITION) ditaruh di default tablespace dari user (schema) yang bersangkutan.
VIEW (data dictionary)

Beberapa contoh VIEW yang sering dipakai untuk melihat informasi PARTISI dan SUBPARTISI adalah DBA_TABLES, DBA_TAB_PARTITIONS, DBA_TAB_SUBPARTITIONS, DBA_INDEXES, DBA_IND_PARTITIONS, DBA_IND_SUBPARTITIONS.

Untuk melihat VIEW-VIEW yang lain, bisa query ke DICT:

SQL> select table_name from dict
where table_name like '%PARTITION%' order by table_name;Referensi
Oracle® Database Administrator’s Guide 10g Release 2 (10.2)
Managing Partitioned Tables and Indexes

Tidak ada komentar: