全部产品
Search
文档中心

PolarDB:Analisis statistik kolom tertentu dalam mode tabel lebar

更新时间:Dec 10, 2025

Tabel lebar dapat memiliki puluhan hingga ratusan kolom. Kueri sering kali hanya perlu menganalisis beberapa kolom tersebut. Anda dapat menggunakan indeks penyimpanan kolom (columnstore index) untuk mempercepat kueri ini.

Informasi latar belakang

Di banyak sistem bisnis SaaS, sebuah tabel mungkin memiliki puluhan hingga ratusan kolom, yang menimbulkan tantangan teknis bagi kueri.

  • Hanya beberapa kolom yang relevan untuk analisis dalam beberapa kueri, namun banyak kolom tidak relevan yang tetap dibaca saat menggunakan mesin penyimpanan berorientasi baris. Hal ini meningkatkan beban I/O pada sistem.

  • Mode kueri tidak selalu tetap. Beberapa kondisi filter dapat digunakan ketika Anda menjalankan kueri terhadap ratusan kolom. Saat membuat indeks gabungan, semua skenario kueri harus dipertimbangkan terlebih dahulu. Jika kondisi kueri berubah, indeks gabungan menjadi tidak valid.

Indeks penyimpanan kolom sangat cocok untuk kedua skenario tersebut. Karena indeks penyimpanan kolom bersifat berbasis kolom, membaca satu kolom tidak memengaruhi kolom lainnya. Kolom-kolom tersebut juga bersifat independen, sehingga urutan beberapa kondisi filter tidak memengaruhi efektivitas indeks penyimpanan kolom.

Hasil

Dengan set data berukuran 100 juta baris dan tingkat paralelisme sebesar 4, kueri yang menggunakan indeks penyimpanan kolom berjalan 30 kali lebih cepat dibandingkan eksekusi paralel native di PostgreSQL.

Query

Eksekusi paralel di PostgreSQL asli

Indeks penyimpanan kolom

Q1

243 dtk

7,9 dtk

Prosedur

Langkah 1: Siapkan lingkungan

  1. Pastikan versi dan konfigurasi kluster Anda memenuhi persyaratan berikut:

    • Versi kluster:

      • PostgreSQL 16 (versi mesin minor 2.0.16.8.3.0 atau lebih baru)

      • PostgreSQL 14 (versi mesin minor 2.0.14.10.20.0 atau lebih baru)

      Catatan

      Anda dapat melihat nomor versi mesin minor di Konsol atau dengan menjalankan pernyataan SHOW polardb_version;. Jika versi mesin minor tidak memenuhi persyaratan, Anda harus meningkatkan versi mesin minor.

    • Tabel sumber harus memiliki kunci primer. Kolom kunci primer harus disertakan saat Anda membuat indeks penyimpanan kolom.

    • Parameter wal_level harus diatur ke logical. Hal ini menambahkan informasi yang diperlukan untuk mendukung replikasi logis ke dalam write-ahead logging (WAL).

      Catatan

      Anda dapat mengatur parameter wal_level di Konsol. Mengubah parameter ini akan me-restart kluster. Rencanakan operasi bisnis Anda dengan cermat dan lanjutkan secara hati-hati.

  2. Aktifkan fitur indeks penyimpanan kolom.

    Cara mengaktifkan fitur indeks penyimpanan kolom bervariasi tergantung pada versi mesin minor kluster PolarDB for PostgreSQL Anda:

    PostgreSQL 16 (2.0.16.9.8.0 atau lebih baru) atau PostgreSQL 14 (2.0.14.17.35.0 atau lebih baru)

    Untuk kluster PolarDB for PostgreSQL dengan versi-versi tersebut, tersedia dua metode. Perbedaannya diuraikan dalam tabel berikut. Anda dapat memilih metode yang paling sesuai dengan kebutuhan Anda.

    Item perbandingan

    [Direkomendasikan] Tambahkan node read-only indeks penyimpanan kolom

    Gunakan langsung ekstensi indeks penyimpanan kolom yang telah dipra-instal

    Metode

    Anda dapat menambahkan node indeks penyimpanan kolom secara manual melalui antarmuka visual di Konsol.

    Tidak perlu tindakan apa pun. Anda dapat langsung menggunakan ekstensi tersebut.

    Alokasi resource

    Mesin penyimpanan kolom menggunakan seluruh resource secara eksklusif dan dapat memanfaatkan seluruh memori yang tersedia.

    Mesin penyimpanan kolom hanya dapat menggunakan 25% memori. Sisa memori dialokasikan untuk mesin penyimpanan baris (row store engine).

    Dampak bisnis

    Beban kerja pemrosesan transaksional (TP) dan pemrosesan analitis (AP) diisolasi pada node yang berbeda dan tidak saling memengaruhi.

    Beban kerja TP dan AP berjalan pada node yang sama dan saling memengaruhi.

    Biaya

    Node read-only In-Memory Column Index (IMCI) dikenai biaya tambahan dan ditagih dengan tarif yang sama seperti node komputasi reguler.

    Tidak ada biaya tambahan.

    Tambahkan node read-only indeks penyimpanan kolom

    Anda dapat menambahkan node read-only indeks penyimpanan kolom dengan salah satu dari dua cara berikut:

    Catatan

    Kluster harus berisi setidaknya satu node read-only. Anda tidak dapat menambahkan node read-only indeks penyimpanan kolom ke kluster single-node.

    Tambahkan di Konsol
    1. Login ke Konsol PolarDB dan pilih wilayah tempat kluster berada. Anda dapat membuka wizard Add/Remove Node dengan salah satu cara berikut:

      • Pada halaman Clusters, klik Add/Remove Node di kolom Actions.

        image

      • Pada halaman Basic Information kluster target, klik Add/Remove Node di bagian Database Nodes.

        image

    2. Pilih Add Read-only IMCI Node dan klik OK.

    3. Pada halaman upgrade/downgrade kluster, tambahkan node read-only indeks penyimpanan kolom dan selesaikan pembayaran.

      1. Klik Add an IMCI Node dan pilih spesifikasi node.

      2. Pilih waktu alih bencana (switchover).

      3. (Opsional) Tinjau Ketentuan Layanan Produk dan Perjanjian Tingkat Layanan.

      4. Klik Buy Now.

      image

    4. Setelah pembayaran selesai, kembali ke halaman detail kluster dan tunggu hingga node read-only indeks penyimpanan kolom ditambahkan. Node tersebut berhasil ditambahkan ketika statusnya berubah menjadi Running.image

    Tambahkan saat pembelian

    Pada halaman pembelian PolarDB, pilih jumlah Nodes untuk parameter IMCI Read-Only Nodes.

    image

    PostgreSQL 16 (2.0.16.8.3.0 hingga 2.0.16.9.8.0) atau PostgreSQL 14 (2.0.14.10.20.0 hingga 2.0.14.17.35.0)

    Untuk kluster PolarDB for PostgreSQL dengan versi-versi tersebut, indeks penyimpanan kolom diterapkan sebagai ekstensi polar_csi di kluster database. Sebelum dapat menggunakan indeks penyimpanan kolom, Anda harus membuat ekstensi tersebut di database yang ditentukan.

    Catatan
    • Ekstensi polar_csi berlaku pada tingkat database. Untuk menggunakan indeks penyimpanan kolom di beberapa database dalam satu kluster, Anda harus membuat ekstensi polar_csi untuk setiap database.

    • Akun database yang digunakan untuk menginstal ekstensi harus merupakan akun istimewa.

    Anda dapat menginstal ekstensi polar_csi dengan salah satu dari dua cara berikut.

    Instal dari Konsol

    1. Login ke Konsol PolarDB. Di panel navigasi sebelah kiri, klik Clusters. Pilih wilayah tempat kluster Anda berada, lalu klik ID kluster untuk membuka halaman detail kluster.

    2. Di panel navigasi sebelah kiri, pilih Settings and Management > Extension Management. Pada tab Extension Management, pilih Uninstalled Extensions.

    3. Di pojok kanan atas halaman, pilih database target. Pada baris ekstensi polar_csi, klik Install di kolom Actions. Pada kotak dialog Install Extension yang muncul, pilih Database Account target dan klik OK untuk menginstal ekstensi di database target.

      image.png

    Instal dari command line

    Hubungkan ke kluster database dan jalankan pernyataan berikut di database target tempat Anda memiliki izin yang diperlukan untuk membuat ekstensi polar_csi.

    CREATE EXTENSION polar_csi;

Langkah 2: Siapkan data

Contoh ini menggunakan tabel bernama widecolumntable yang berisi 24 kolom dengan tipe data seperti BIGINT, DECIMAL, TEXT, JSONB, dan TEXT[]. Contoh ini menganalisis lima kolom (id_1, domain, consumption, start_time, dan end_time) untuk menghitung total pengeluaran tiap pelanggan di berbagai domain selama satu tahun terakhir.

  1. Buat tabel bernama widecolumntable dengan skema tabel berikut. Kemudian, masukkan data uji sesuai kebutuhan.

    CREATE TABLE widecolumntable (
      id_1 BIGINT NOT NULL PRIMARY KEY,
      id_2 BIGINT,
      id_3 BIGINT,
      id_4 BIGINT,
      id_5 BIGINT,
      id_6 BIGINT,
      version INT,
      domain TEXT,
      consumption DECIMAL(18,3),
      c_level CHARACTER varying(1) NOT NULL,
      priority BIGINT,
      operator TEXT,
      notify_policy TEXT,
      call_id UUID NOT NULL,
      provider_id BIGINT NOT NULL,
      name_1 TEXT NOT NULL,
      name_2 TEXT NOT NULL,
      name_3 TEXT,
      start_time TIMESTAMP WITH TIME ZONE NOT NULL,
      end_time TIMESTAMP WITH TIME ZONE NOT NULL,
      comment JSONB NOT NULL,
      description TEXT[] NOT NULL,
      created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
      updated_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL
    );
  2. Tambahkan kolom id_1, domain, consumption, start_time, dan end_time ke dalam indeks penyimpanan kolom.

    CREATE INDEX idx_wide_csi ON widecolumntable USING CSI(id_1, domain, consumption,  start_time, end_time);

Langkah 3: Jalankan kueri

Gunakan mesin eksekusi yang berbeda untuk menjalankan kueri yang menghitung total pengeluaran tiap pelanggan di berbagai domain selama satu tahun terakhir dan mengurutkan hasil berdasarkan total pengeluaran.

  • Gunakan indeks penyimpanan kolom.

    --- Aktifkan indeks penyimpanan kolom dan atur tingkat paralelisme ke 4.
    SET polar_csi.enable_query to on;
    SET polar_csi.exec_parallel to 4;
    
    ---Q1
    EXPLAIN ANALYZE SELECT id_1, domain,SUM(consumption) FROM widecolumntable WHERE start_time > '20230101' and end_time < '20240101' GROUP BY id_1, domain Order By SUM(consumption);
  • Nonaktifkan indeks penyimpanan kolom dan gunakan mesin penyimpanan baris (row store engine).

    --- Nonaktifkan indeks penyimpanan kolom, gunakan mesin penyimpanan baris, dan atur tingkat paralelisme ke 4.
    SET polar_csi.enable_query to off;
    SET max_parallel_workers_per_gather to 4;
    
    ---Q1
    EXPLAIN ANALYZE SELECT id_1, domain,SUM(consumption) FROM widecolumntable WHERE start_time > '20230101' and end_time < '20240101' GROUP BY id_1, domain Order By SUM(consumption);