Pembagian rentang interval merupakan perluasan dari pembagian rentang. Fitur ini memungkinkan database secara otomatis membuat partisi ketika data yang akan dimasukkan melebihi rentang partisi yang ada.
Untuk mengimplementasikan pembagian rentang interval, Anda harus menyertakan klausa INTERVAL dan menentukan ukuran rentang untuk partisi baru. Nilai kunci pembagian rentang menentukan nilai tertinggi dari partisi rentang. Ketika nilai data yang akan dimasukkan melebihi nilai tertinggi tersebut, database akan membuat partisi baru untuk menyimpan data tersebut.
Misalnya, jika Anda menetapkan interval menjadi satu bulan, dan data yang akan dimasukkan merujuk pada data dua bulan setelah titik transisi saat ini, hanya partisi untuk bulan tempat data tersebut termasuk yang dibuat. Partisi untuk bulan di antaranya tidak dibuat. Titik transisi adalah nilai kunci. Ketika data melebihi titik transisi, data dimasukkan ke dalam partisi rentang interval berikutnya. Sebagai contoh, jika Anda membuat tabel terpartisi rentang interval dengan interval satu bulan dan titik transisi saat ini adalah 15 Februari 2019, serta mencoba memasukkan data untuk 10 Mei 2019, database akan membuat partisi untuk periode 15 April 2019 hingga 15 Mei 2019. Data kemudian dimasukkan ke dalam partisi ini. Partisi untuk periode 15 Februari 2019 hingga 15 Maret 2019 dan 15 Maret 2019 hingga 15 April 2019 dilewati.
Batasan
- Pembagian rentang interval hanya mendukung satu kunci partisi. Kunci ini harus menentukan rentang numerik atau tanggal.
- Anda harus mendefinisikan setidaknya satu partisi rentang.
- Klausa INTERVAL tidak dapat digunakan untuk tabel yang diorganisir berdasarkan indeks.
- Indeks domain tidak dapat dibuat pada tabel terpartisi daftar.
- Nilai NULL, Bukan-angka, atau Tak Terbatas tidak dapat ditentukan dalam kolom kunci partisi.
- Ekspresi yang digunakan untuk mengimplementasikan pembagian rentang interval harus menghasilkan nilai konstan non-negatif.
- Partisi untuk tabel terpartisi rentang interval hanya dapat dibuat dalam urutan menaik.
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>]...);
Where range_partition_definition is:
PARTITION [<partition_name>]
VALUES LESS THAN (<value>[, <value>]...)
[TABLESPACE <tablespace_name>]
[(<subpartition>, ...)]Parameter INTERVAL hanya mendukung interval numerik dan waktu.
- Interval Numerik
Pernyataan berikut memasukkan setiap 10 angka berdekatan ke dalam satu partisi:
INTERVAL (10) - Interval Waktu
- Tahun
Pernyataan berikut menetapkan partisi otomatis berdasarkan tahun:
INTERVAL (NUMTOYMINTERVAL(1,'year')) - Bulan
Pernyataan berikut menetapkan partisi otomatis berdasarkan bulan:
INTERVAL (NUMTOYMINTERVAL(1,'month')) - Hari
Pernyataan berikut menetapkan partisi otomatis berdasarkan hari:
INTERVAL (NUMTODSINTERVAL(1,'day')) - Minggu
Pernyataan berikut menetapkan partisi otomatis berdasarkan minggu:
INTERVAL (NUMTODSINTERVAL(7,'day'))
- Tahun
Untuk informasi lebih lanjut tentang parameter lainnya, lihat CREATE TABLE... PARTITION BY.
Contoh
Dalam contoh berikut, tabel penjualan dipartisi berdasarkan kolom sold_month pada interval tertentu. Partisi rentang dibuat untuk menetapkan titik transisi. Nilai yang melampaui titik transisi dimasukkan ke dalam partisi baru.
Buat tabel terpartisi rentang interval dan tambahkan data ke tabel, seperti yang ditunjukkan dalam contoh berikut:
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 tampilan ALL_TAB_PARTITIONS, seperti yang ditunjukkan dalam contoh berikut:
SELECT partition_name, high_value from ALL_TAB_PARTITIONS;Hasil berikut dikembalikan:
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 data yang melebihi nilai tinggi partisi rentang ke tabel penjualan, seperti yang ditunjukkan dalam contoh berikut:
INSERT INTO sales VALUES (1,200,'10-MAY-2019');
INSERT 0 1Setelah memasukkan data, kueri tampilan ALL_TAB_PARTITIONS lagi, seperti yang ditunjukkan dalam contoh berikut:
SELECT partition_name, high_value from ALL_TAB_PARTITIONS;Jika data dimasukkan, sistem menghasilkan nama untuk partisi rentang interval. Nama tersebut bervariasi berdasarkan sesi. Hasil berikut dikembalikan:
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)