Pembagian rentang interval memperluas pembagian rentang dengan secara otomatis membuat partisi baru saat data masuk. Ketika data yang dimasukkan melebihi nilai tertinggi dari partisi rentang terakhir yang telah didefinisikan, database akan membuat partisi baru tanpa memerlukan intervensi manual.
Untuk menggunakan pembagian rentang interval, sertakan klausa INTERVAL dalam pernyataan CREATE TABLE dan tentukan ukuran partisi. Nilai kunci partisi menentukan nilai tertinggi setiap partisi rentang, yang berfungsi sebagai titik transisi: data yang melebihi batas ini akan memicu pembuatan partisi secara otomatis.
Cara pengabaian bekerja: Jika data jatuh pada dua atau lebih interval di luar titik transisi saat ini, database hanya membuat partisi yang berisi data tersebut — bukan partisi-partisi di antaranya.
Contoh: Misalnya, intervalnya adalah satu bulan dan titik transisi saat ini adalah 15 Februari 2019. Memasukkan baris dengan tanggal 10 Mei 2019 akan membuat partisi yang mencakup periode 15 April–15 Mei 2019. Partisi untuk periode 15 Februari–15 Maret dan 15 Maret–15 April diabaikan — hanya partisi yang benar-benar berisi data yang dibuat.
Sintaksis
CREATE TABLE [schema.]<table_name>
<table_definition>
PARTITION BY RANGE (<column> [, <column>]...)
[INTERVAL (<constant> | <expression>)]
[SUBPARTITION BY {RANGE | LIST | HASH} (<column> [, <column>]...)]
(<range_partition_definition> [, <range_partition_definition>]...);Di mana range_partition_definition adalah:
PARTITION [<partition_name>]
VALUES LESS THAN (<value> [, <value>]...)
[TABLESPACE <tablespace_name>]
[(<subpartition>, ...)]Parameter INTERVAL menerima ekspresi numerik dan waktu:
| Jenis | Ekspresi | Efek |
|---|---|---|
| Numerik | INTERVAL (10) | Satu partisi per 10 nilai berurutan |
| Tahun | INTERVAL (NUMTOYMINTERVAL(1, 'year')) | Satu partisi per tahun |
| Bulan | INTERVAL (NUMTOYMINTERVAL(1, 'month')) | Satu partisi per bulan |
| Hari | INTERVAL (NUMTODSINTERVAL(1, 'day')) | Satu partisi per hari |
| Minggu | INTERVAL (NUMTODSINTERVAL(7, 'day')) | Satu partisi per minggu |
Untuk sintaksis lengkap CREATE TABLE ... PARTITION BY, lihat CREATE TABLE... PARTITION BY.
Contoh
Contoh berikut membuat tabel sales yang dipartisi berdasarkan sold_month dengan interval satu bulan. Dua partisi rentang awal menetapkan titik transisi; baris yang melebihi titik tersebut akan memicu pembuatan partisi secara otomatis.
Buat tabel:
CREATE TABLE sales
(
prod_id int,
prod_quantity int,
sold_month date
)
PARTITION BY RANGE(sold_month)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION p1
VALUES LESS THAN('15-JAN-2019'),
PARTITION p2
VALUES LESS THAN('15-FEB-2019')
);Kueri partisi awal:
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS; partition_name | high_value
----------------+--------------------------------------------------------------
P1 | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
P2 | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(2 rows)Masukkan baris di luar titik transisi:
INSERT INTO sales VALUES (1, 200, '10-MAY-2019');INSERT 0 1Kueri partisi lagi:
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS; partition_name | high_value
----------------+--------------------------------------------------------------
SYS596430103 | FOR VALUES FROM ('15-APR-19 00:00:00') TO ('15-MAY-19 00:00:00')
P1 | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
P2 | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(3 rows)Database secara otomatis membuat satu partisi baru untuk menampung baris bertanggal 10 Mei 2019. Partisi yang mencakup periode 15 Februari–15 Maret dan 15 Maret–15 April diabaikan karena tidak ada data yang jatuh dalam rentang tersebut.
Sistem memberikan nama dengan awalan SYS (seperti SYS596430103) untuk setiap partisi yang dibuat secara otomatis. Nama tersebut unik tetapi berbeda-beda tergantung sesi.
Batasan pada pembagian rentang interval
Kolom kunci partisi harus berupa satu kolom yang menentukan rentang numerik atau tanggal.
Setidaknya satu partisi rentang harus didefinisikan sebelum klausa
INTERVALberlaku.Klausa
INTERVALtidak didukung untuk tabel yang diorganisasi berdasarkan indeks (index-organized tables).Indeks Domain tidak dapat dibuat pada tabel yang dipartisi berdasarkan daftar (list-partitioned tables).
Kolom kunci partisi tidak boleh berisi nilai NULL, Not-a-Number, atau Infinity.
Ekspresi dalam klausa
INTERVALharus dievaluasi menjadi nilai konstan non-negatif.Partisi rentang interval hanya dibuat dalam urutan menaik.