全部产品
Search
文档中心

PolarDB:CREATE TABLE... PARTITION BY

更新时间:Jul 02, 2025

Anda dapat menggunakan klausa PARTITION BY dari pernyataan CREATE TABLE untuk membuat tabel terpartisi. Data dalam tabel ini didistribusikan di antara satu atau lebih partisi (dan subpartisi).

Sintaksis

Pernyataan CREATE TABLE memiliki tiga bentuk berikut:

  • Sintaksis partisi daftar

    Bentuk pertama digunakan untuk membuat tabel terpartisi daftar:

    CREATE TABLE [ schema. ]table_name
     table_definition
       PARTITION BY LIST(column)
       [SUBPARTITION BY {RANGE|LIST|HASH} (column[, column ]...)]
       (list_partition_definition[, list_partition_definition]...);

    list_partition_definition adalah:

    PARTITION [partition_name]
      VALUES (value[, value]...)
      [TABLESPACE tablespace_name]
      [(subpartition, ...)]
  • Sintaksis partisi rentang

    Bentuk kedua digunakan untuk membuat tabel terpartisi rentang:

    CREATE TABLE [ schema. ]table_name
     table_definition
       PARTITION BY RANGE(column[, column ]...)
       [SUBPARTITION BY {RANGE|LIST|HASH} (column[, column ]...)]
       (range_partition_definition[, range_partition_definition]...);

    range_partition_definition adalah:

    PARTITION [partition_name]
      VALUES LESS THAN (value[, value]...)
      [TABLESPACE tablespace_name]
      [(subpartition, ...)]
  • Sintaksis subpartisi

    Subpartisi dapat berupa salah satu dari dua jenis berikut:

    {list_subpartition | range_subpartition}

    list_subpartition adalah:

    SUBPARTITION [subpartition_name]
      VALUES (value[, value]...)
      [TABLESPACE tablespace_name]

    range_subpartition adalah:

    SUBPARTITION [subpartition_name]
      VALUES LESS THAN (value[, value]...)
      [TABLESPACE tablespace_name]

Ikhtisar

Pernyataan CREATE TABLE... PARTITION BY membuat tabel dengan satu atau beberapa partisi. Setiap partisi dapat memiliki satu atau lebih subpartisi. Jumlah partisi yang didefinisikan tidak terbatas. Jika Anda menyertakan klausa PARTITION BY, minimal satu aturan partisi harus ditentukan. Tabel yang dihasilkan dimiliki oleh pengguna yang membuatnya.

Gunakan klausa PARTITION BY LIST untuk membagi tabel menjadi partisi berdasarkan nilai dalam kolom tertentu. Setiap aturan partisi harus menentukan minimal satu nilai literal. Jumlah nilai yang dapat ditentukan tidak terbatas. Sertakan aturan dengan nilai DEFAULT untuk mengarahkan baris yang tidak memenuhi syarat ke partisi tertentu.

Gunakan klausa PARTITION BY RANGE untuk menentukan aturan batas pembuatan partisi. Setiap aturan partisi harus mencakup setidaknya satu kolom dengan tipe data yang mendukung dua operator (misalnya, operator lebih besar dari atau sama dengan dan operator kurang dari). Batas rentang dievaluasi berdasarkan klausa LESS THAN dan bersifat non-inclusive. Batas tanggal 1 Januari 2013 hanya mencakup nilai tanggal hingga 31 Desember 2012.

Aturan partisi rentang harus ditentukan dalam urutan menaik. Jika pernyataan INSERT menyimpan baris dengan nilai melebihi batas atas tabel terpartisi rentang, pernyataan tersebut akan gagal. Namun, pernyataan tidak akan gagal jika aturan partisi mencakup batas dengan nilai MAXVALUE. Jika aturan MAXVALUE tidak disertakan, baris yang melebihi batas maksimum akan menyebabkan kesalahan.

Gunakan kata kunci TABLESPACE untuk menentukan nama tablespace tempat partisi atau subpartisi akan dibuat. Jika tidak ditentukan, partisi atau subpartisi akan dibuat di tablespace default.

Jika sintaksis CREATE TABLE digunakan untuk membuat indeks pada tabel terpartisi, indeks akan dibuat pada setiap partisi atau subpartisi.

Jika definisi tabel mencakup klausa SUBPARTITION BY, setiap partisi dalam tabel akan memiliki minimal satu subpartisi. Subpartisi dapat didefinisikan secara eksplisit atau ditentukan oleh sistem.

Jika subpartisi ditentukan oleh sistem, subpartisi yang dihasilkan server akan berada di tablespace default, dan nama subpartisi akan ditetapkan oleh server. Server akan membuat:

  • Subpartisi DEFAULT jika klausa SUBPARTITION BY menentukan LIST.

  • Subpartisi MAXVALUE jika klausa SUBPARTITION BY menentukan RANGE.

Nama subpartisi yang dihasilkan server merupakan kombinasi dari nama partisi dan pengenal unik. Anda dapat memeriksa tabel ALL_TAB_SUBPARTITIONS untuk melihat daftar lengkap nama subpartisi.

Parameter

Parameter

Deskripsi

table_name

Nama (opsional memenuhi skema) dari tabel yang akan dibuat.

table_definition

Nama kolom, tipe data, dan informasi kendala seperti yang dijelaskan dalam dokumentasi inti PostgreSQL untuk pernyataan CREATE TABLE.

partition_name

Nama partisi yang akan dibuat. Nama partisi harus unik di antara semua partisi dan subpartisi, dan harus mengikuti konvensi penamaan untuk pengenal objek.

subpartition_name

Nama subpartisi yang akan dibuat. Nama subpartisi harus unik di antara semua partisi dan subpartisi, dan harus mengikuti konvensi penamaan untuk pengenal objek.

column

Nama kolom tempat aturan partisi didasarkan. Setiap baris akan disimpan dalam partisi yang sesuai dengan nilai kolom yang ditentukan.

(value[, value]...)

Gunakan value untuk menentukan nilai literal yang dikutip (atau daftar nilai literal dipisahkan koma) berdasarkan mana entri tabel akan dikelompokkan ke dalam partisi. Setiap aturan partisi harus menentukan setidaknya satu nilai, tetapi jumlah nilai yang ditentukan dalam aturan tidak terbatas. value dapat berupa null, default (jika menentukan partisi LIST), atau maxvalue (jika menentukan partisi RANGE).

Ketika Anda menentukan aturan untuk tabel terpartisi daftar, sertakan kata kunci DEFAULT dalam aturan partisi terakhir untuk mengarahkan baris yang tidak cocok ke partisi yang ditentukan. Jika Anda tidak menyertakan nilai DEFAULT, pernyataan INSERT apa pun yang mencoba menambahkan baris yang tidak cocok dengan aturan yang ditentukan dari setidaknya satu partisi akan gagal dan mengembalikan kesalahan.

Ketika Anda menentukan aturan untuk tabel terpartisi rentang, sertakan kata kunci MAXVALUE dalam aturan partisi terakhir untuk mengarahkan baris yang tidak dikategorikan ke partisi yang ditentukan. Jika Anda tidak menyertakan partisi MAXVALUE, pernyataan INSERT apa pun yang mencoba menambahkan baris di mana kunci partisi lebih besar dari nilai tertinggi yang ditentukan akan gagal dan mengembalikan kesalahan.

tablespace_name

Nama tablespace tempat partisi atau subpartisi berada.

Contoh - PARTITION BY LIST

Contoh berikut menggunakan klausa PARTITION BY LIST untuk membuat tabel terpartisi bernama sales. Tabel sales menyimpan informasi dalam tiga partisi (europe, asia, dan americas):

CREATE TABLE sales
(
  dept_no     number,   
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY LIST(country)
(
  PARTITION europe VALUES('FRANCE', 'ITALY'),
  PARTITION asia VALUES('INDIA', 'PAKISTAN'),
  PARTITION americas VALUES('US', 'CANADA')
);

Tabel yang dihasilkan dipartisi berdasarkan nilai dalam kolom country:

acctg=# SELECT partition_name, high_value from ALL_TAB_PARTITIONS;
 partition_name |     high_value      
----------------+---------------------
 americas       | 'US', 'CANADA'      
 asia           | 'INDIA', 'PAKISTAN' 
 europe         | 'FRANCE', 'ITALY'   
(3 rows)
  • Baris dengan nilai US atau CANADA dalam kolom country disimpan dalam partisi americas.

  • Baris dengan nilai INDIA atau PAKISTAN dalam kolom country disimpan dalam partisi asia.

  • Baris dengan nilai FRANCE atau ITALY dalam kolom country disimpan dalam partisi europe.

Server mengevaluasi pernyataan berikut berdasarkan aturan partisi dan menyimpan baris dalam partisi europe:

INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');

Contoh - PARTITION BY RANGE

Contoh berikut menggunakan klausa PARTITION BY RANGE untuk membuat tabel terpartisi bernama sales. Tabel sales menyimpan informasi dalam empat partisi (q1_2012, q2_2012, q3_2012, dan q4_2012).

CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY RANGE(date)
(
  PARTITION q1_2012 
    VALUES LESS THAN('2012-Apr-01'),
  PARTITION q2_2012 
    VALUES LESS THAN('2012-Jul-01'),
  PARTITION q3_2012 
    VALUES LESS THAN('2012-Oct-01'),
  PARTITION q4_2012 
    VALUES LESS THAN('2013-Jan-01')
);

Tabel yang dihasilkan dipartisi berdasarkan nilai dalam kolom date:

SELECT partition_name, high_value from ALL_TAB_PARTITIONS;
 partition_name |                            high_value                            
----------------+------------------------------------------------------------------
 q1_2012        | FOR VALUES FROM (MINVALUE) TO ('01-APR-12 00:00:00')
 q2_2012        | FOR VALUES FROM ('01-APR-12 00:00:00') TO ('01-JUL-12 00:00:00')
 q3_2012        | FOR VALUES FROM ('01-JUL-12 00:00:00') TO ('01-OCT-12 00:00:00')
 q4_2012        | FOR VALUES FROM ('01-OCT-12 00:00:00') TO ('01-JAN-13 00:00:00')
(4 rows)
  • Baris dengan nilai dalam kolom date sebelum 1 April 2012 disimpan dalam partisi q1_2012.

  • Baris dengan nilai dalam kolom date sebelum 1 Juli 2012 disimpan dalam partisi q2_2012.

  • Baris dengan nilai dalam kolom date sebelum 1 Oktober 2012 disimpan dalam partisi q3_2012.

  • Baris dengan nilai dalam kolom date sebelum 1 Januari 2013 disimpan dalam partisi q4_2012.

Server mengevaluasi pernyataan berikut berdasarkan aturan partisi dan menyimpan baris dalam partisi q3_2012:

INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');

Contoh - PARTITION BY RANGE, SUBPARTITION BY LIST

Contoh berikut membuat tabel terpartisi (sales) yang pertama kali dipartisi menggunakan tanggal transaksi. Kemudian, partisi rentang (q1_2012, q2_2012, q3_2012, dan q4_2012) dipartisi daftar menggunakan nilai kolom country.

CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY RANGE(date)
  SUBPARTITION BY LIST(country)
  (
    PARTITION q1_2012 
      VALUES LESS THAN('2012-Apr-01')
      (
        SUBPARTITION q1_europe VALUES ('FRANCE', 'ITALY'),
        SUBPARTITION q1_asia VALUES ('INDIA', 'PAKISTAN'),
        SUBPARTITION q1_americas VALUES ('US', 'CANADA')
       ),
  PARTITION q2_2012 
    VALUES LESS THAN('2012-Jul-01')
      (
        SUBPARTITION q2_europe VALUES ('FRANCE', 'ITALY'),
        SUBPARTITION q2_asia VALUES ('INDIA', 'PAKISTAN'),
        SUBPARTITION q2_americas VALUES ('US', 'CANADA')
       ),
  PARTITION q3_2012 
    VALUES LESS THAN('2012-Oct-01')
      (
        SUBPARTITION q3_europe VALUES ('FRANCE', 'ITALY'),
        SUBPARTITION q3_asia VALUES ('INDIA', 'PAKISTAN'),
        SUBPARTITION q3_americas VALUES ('US', 'CANADA')
       ),
  PARTITION q4_2012 
    VALUES LESS THAN('2013-Jan-01')
      (
        SUBPARTITION q4_europe VALUES ('FRANCE', 'ITALY'),
        SUBPARTITION q4_asia VALUES ('INDIA', 'PAKISTAN'),
        SUBPARTITION q4_americas VALUES ('US', 'CANADA')
       )
);

Tabel yang dibuat menggunakan pernyataan ini memiliki empat partisi. Setiap partisi memiliki tiga subpartisi:

SELECT subpartition_name, high_value, partition_name FROM ALL_TAB_SUBPARTITIONS;
 subpartition_name |             high_value              | partition_name 
-------------------+-------------------------------------+----------------
 q1_americas       | FOR VALUES IN ('US', 'CANADA')      | q1_2012
 q1_asia           | FOR VALUES IN ('INDIA', 'PAKISTAN') | q1_2012
 q1_europe         | FOR VALUES IN ('FRANCE', 'ITALY')   | q1_2012
 q2_americas       | FOR VALUES IN ('US', 'CANADA')      | q2_2012
 q2_asia           | FOR VALUES IN ('INDIA', 'PAKISTAN') | q2_2012
 q2_europe         | FOR VALUES IN ('FRANCE', 'ITALY')   | q2_2012
 q3_americas       | FOR VALUES IN ('US', 'CANADA')      | q3_2012
 q3_asia           | FOR VALUES IN ('INDIA', 'PAKISTAN') | q3_2012
 q3_europe         | FOR VALUES IN ('FRANCE', 'ITALY')   | q3_2012
 q4_americas       | FOR VALUES IN ('US', 'CANADA')      | q4_2012
 q4_asia           | FOR VALUES IN ('INDIA', 'PAKISTAN') | q4_2012
 q4_europe         | FOR VALUES IN ('FRANCE', 'ITALY')   | q4_2012
(12 rows)

Ketika baris ditambahkan ke tabel ini, nilai dalam kolom date dibandingkan dengan nilai yang ditentukan dalam aturan partisi rentang. Server memilih partisi tempat baris tersebut akan berada. Nilai dalam kolom country kemudian dibandingkan dengan nilai yang ditentukan dalam aturan subpartisi daftar. Ketika server menemukan kecocokan untuk nilai tersebut, baris disimpan dalam subpartisi yang sesuai.

Setiap baris yang ditambahkan ke tabel disimpan dalam subpartisi. Oleh karena itu, semua partisi tidak berisi data.

Server mengevaluasi pernyataan berikut berdasarkan aturan partisi dan subpartisi dan menyimpan baris dalam partisi q3_europe:

INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');