All Products
Search
Document Center

PolarDB:DML mendukung GLOBAL PARTITIONED INDEX SCAN

Last Updated:Sep 15, 2026

Ketika tabel partisi memiliki indeks partisi global yang didefinisikan pada kolom non-partition-key, PolarDB for Oracle dapat menggunakan pemindaian indeks partisi global dalam operasi DELETE dan UPDATE. Alih-alih memindai setiap partisi tabel, database hanya menargetkan partisi indeks yang memenuhi predikat—sehingga mengurangi I/O untuk kueri yang melakukan filter berdasarkan kolom non-partition-key.

Cara kerja

Indeks partisi global menggunakan skema partisinya sendiri yang independen dari tabel dasar. Berbeda dengan indeks lokal (yang dipartisi bersamaan dengan tabel), indeks global mencakup semua partisi tabel dan dipartisi berdasarkan kolom yang berbeda. Hal ini membuatnya efisien ketika klausa WHERE menargetkan kolom yang diindeks, bukan kunci partisi tabel.

Selama operasi DML:

  1. Database menemukan baris yang sesuai menggunakan indeks partisi global.

  2. Untuk setiap partisi indeks yang sesuai, dilakukan pemindaian terarah.

  3. Operasi DELETE atau UPDATE hanya diterapkan pada baris yang ditemukan.

Rencana kueri menampilkan GLOBAL PARTITIONED INDEX SCAN(m/n), di mana m adalah partisi indeks yang sedang dipindai dan n adalah jumlah total partisi indeks.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Tabel partisi dengan indeks partisi global yang didefinisikan padanya

  • Statistik tabel yang mutakhir—jalankan ANALYZE setelah memasukkan data agar planner dapat memilih jalur pemindaian indeks partisi global

Tanpa statistik yang mutakhir, planner kueri mungkin kembali menggunakan pemindaian partisi penuh alih-alih menggunakan indeks partisi global.

Menyiapkan contoh

Langkah-langkah berikut membuat tabel partisi gi_ora dan indeks partisi global pada kolom b, lalu memasukkan data uji.

  1. Buat tabel dengan partisi RANGE pada kolom a:

    CREATE TABLE gi_ora
    (
        a int,
        b int,
        c int GENERATED ALWAYS AS (b * 2),
        d int DEFAULT 0,
        e int,
        f text,
        g text
    ) PARTITION BY RANGE (a)
    (
        partition p0 values less than (50),
        partition p1 values less than (100),
        partition p2 values less than (200),
        partition p3 values less than (300),
        partition p4 values less than (400),
        partition p5 values less than (500),
        partition p6 values less than (600),
        partition p7 values less than (700),
        partition p8 values less than (800)
    );
  2. Masukkan 799 baris data uji:

    INSERT INTO gi_ora(a,b,d,e,f,g)
    SELECT i, i, i,
           (random()*1000)::int,
           (random()*30000000)::int::text,
           (random()*30000000)::int::text
    FROM generate_series(1,799) i;
  3. Buat indeks partisi global pada kolom b:

    CREATE INDEX ON gi_ora(b) global PARTITION BY RANGE (b)
    (
        partition gpi_p0 values less than (500),
        partition gpi_p1  values less than (maxvalue)
    );

    Ini membuat indeks bernama gi_ora_b_tableoid_idx dengan dua partisi indeks: gpi_p0 (b < 500) dan gpi_p1 (b ≥ 500).

  4. Perbarui statistik tabel agar planner dapat menggunakan indeks:

    ANALYZE gi_ora;

Menggunakan pemindaian indeks partisi global dalam DELETE

Jalankan EXPLAIN untuk memverifikasi bahwa pemindaian indeks partisi global digunakan dalam operasi DELETE:

EXPLAIN (costs off, verbose on) DELETE FROM gi_ora WHERE b = 198;

Output yang diharapkan:

QUERY PLAN
---------------------------------------------------------------------------------------
 DELETE ON public.gi_ora
   ->  GLOBAL PARTITIONED INDEX SCAN(1/2) USING gi_ora_b_tableoid_idx ON public.gi_ora
         Output: gi_ora.tableoid, gi_ora.ctid
         Index Cond: (gi_ora.b = 198)
(4 rows)

Rencana tersebut menampilkan GLOBAL PARTITIONED INDEX SCAN(1/2): database memindai partisi indeks ke-1 dari 2 (gpi_p0, yang mencakup b < 500) untuk menemukan baris dengan b = 198. Hanya partisi indeks tersebut yang dipindai—gpi_p1 dilewati.

Menggunakan pemindaian indeks partisi global dalam UPDATE

Jalankan EXPLAIN untuk memverifikasi bahwa pemindaian indeks partisi global digunakan dalam operasi UPDATE:

EXPLAIN (costs off, verbose on) UPDATE gi_ora SET a = a - 10 WHERE b = 198;

Output yang diharapkan:

QUERY PLAN
---------------------------------------------------------------------------------------
 UPDATE ON public.gi_ora
   ->  GLOBAL PARTITIONED INDEX SCAN(1/2) USING gi_ora_b_tableoid_idx ON public.gi_ora
         Output: (gi_ora.a - 10), gi_ora.tableoid, gi_ora.ctid
         Index Cond: (gi_ora.b = 198)
(4 rows)

Rencana tersebut menampilkan GLOBAL PARTITIONED INDEX SCAN(1/2): database memindai partisi indeks ke-1 dari 2 untuk menemukan baris yang sesuai dengan b = 198, lalu menerapkan ekspresi SET hanya pada baris-baris tersebut.

Batasan

  • Pemindaian indeks partisi global hanya berlaku untuk operasi DELETE dan UPDATE. Operasi INSERT dan SELECT menggunakan jalur eksekusi yang berbeda.

  • Predikat WHERE harus sesuai dengan kolom yang diindeks (kolom b dalam contoh ini).