0Pricing
SQL Academy · Pelajaran

Indeks Konkuren (CREATE INDEX CONCURRENTLY)

Bangun indeks tanpa memblokir penulisan menggunakan CREATE INDEX CONCURRENTLY, dan pulihkan proses pembangunan yang terhenti

Indeks Konkuren (CREATE INDEX CONCURRENTLY) adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Masalah pada CREATE INDEX

CREATE INDEX biasa menggunakan kunci SHARE — memblokir operasi tulis, tetapi tidak pembacaan, selama seluruh proses pembuatan. Pada tabel dengan satu miliar baris, ini berarti penghentian operasi tulis selama beberapa menit.

CONCURRENTLY: Solusinya

CREATE INDEX CONCURRENTLY membuat indeks tanpa memblokir operasi tulis:

CREATE INDEX CONCURRENTLY idx_orders_user_id ON orders(user_id);

Cara Kerjanya

Dua pemindaian tabel:

  1. Pemindaian pertama: membuat indeks dari baris saat ini
  2. Pemindaian kedua: menangkap baris yang berubah selama pemindaian pertama

Selain itu, ada penantian singkat untuk setiap transaksi serentak yang dimulai sebelum proses pembuatan.

Tidak Dapat Dijalankan di Dalam Transaksi

CONCURRENTLY melakukan COMMIT dua kali — jadi tidak dapat berada di dalam blok BEGIN/COMMIT eksplisit:

BEGIN;
CREATE INDEX CONCURRENTLY ...;  -- ERROR
COMMIT;

Lambat, tetapi Daring

CONCURRENTLY membutuhkan waktu lebih lama daripada CREATE INDEX biasa karena melakukan dua pemindaian dan menunggu kunci. Manfaatnya: tanpa waktu henti.

Pemulihan dari Kegagalan

Jika CONCURRENTLY gagal, misalnya karena terhenti atau terjadi kesalahan sistem, indeks akan berada dalam status INVALID:

SELECT relname FROM pg_class
WHERE relkind = 'i' AND NOT pg_index.indisvalid;

-- Fix: drop and re-create:
DROP INDEX CONCURRENTLY my_idx;
CREATE INDEX CONCURRENTLY my_idx ON ...;

REINDEX CONCURRENTLY

Membangun ulang tanpa memblokir, sejak PG 12:

REINDEX INDEX CONCURRENTLY orders_user_id_idx;
REINDEX TABLE CONCURRENTLY orders;

DROP INDEX CONCURRENTLY

Juga tidak memblokir:

DROP INDEX CONCURRENTLY old_idx;

Indeks UNIQUE

Indeks UNIQUE juga dapat dibuat secara CONCURRENTLY. Ini berguna untuk menambahkan batasan UNIQUE secara daring:

CREATE UNIQUE INDEX CONCURRENTLY users_email_uidx ON users(email);
ALTER TABLE users ADD CONSTRAINT users_email_unique UNIQUE USING INDEX users_email_uidx;

Indeks Kunci Asing

Pola standar saat menambahkan FK ke tabel besar:

-- 1. Build the index online:
CREATE INDEX CONCURRENTLY orders_user_id_idx ON orders(user_id);

-- 2. Add the FK with NOT VALID (instant):
ALTER TABLE orders ADD CONSTRAINT orders_user_fk
  FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;

-- 3. Validate in the background:
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;

Biaya Pembuatan Indeks Serentak

Dua pemindaian penuh tabel ditambah pencatatan pengelolaan. Proses ini menghabiskan CPU dan IO. Jika memungkinkan, jalankan pada jam dengan lalu lintas rendah.

Memantau Kemajuan

PG 12+ menyediakan kemajuan proses di pg_stat_progress_create_index:

SELECT phase,
       blocks_done, blocks_total,
       tuples_done, tuples_total
FROM pg_stat_progress_create_index;

Rangkuman

CONCURRENTLY adalah cara yang sesuai untuk produksi dalam mengelola indeks.

  • CREATE/DROP/REINDEX CONCURRENTLY tidak memblokir operasi tulis
  • Tidak dapat berada di dalam transaksi
  • Kegagalan meninggalkan indeks INVALID — bersihkan indeks tersebut
  • Pantau dengan pg_stat_progress_create_index

Pemeriksaan Singkat

Mengapa CREATE INDEX CONCURRENTLY tidak dapat dijalankan di dalam blok BEGIN/COMMIT eksplisit?

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Indeks Konkuren (CREATE INDEX CONCURRENTLY)” gratis?

Ya — teks lengkap “Indeks Konkuren (CREATE INDEX CONCURRENTLY)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Indeks Konkuren (CREATE INDEX CONCURRENTLY)”?

Bangun indeks tanpa memblokir penulisan menggunakan CREATE INDEX CONCURRENTLY, dan pulihkan proses pembangunan yang terhenti Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Indeks Konkuren (CREATE INDEX CONCURRENTLY)” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Migrasi Daring: Mengapa ALTER TABLE Mengunci
  2. Indeks Konkuren (CREATE INDEX CONCURRENTLY)
  3. Mengganti Nama Kolom Tanpa Henti
  4. Alat: Flyway, Liquibase, Sqitch
← Kembali ke SQL Academy