0Pricing
SQL Academy · Ders

Eşzamanlı INDEX'ler (CREATE INDEX CONCURRENTLY)

CREATE INDEX CONCURRENTLY kullanarak yazma işlemlerini engellemeden INDEX'ler oluşturun ve kesintiye uğrayan oluşturma işlemlerini kurtarın.

Eşzamanlı INDEX'ler (CREATE INDEX CONCURRENTLY), CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.

CREATE INDEX Sorunu

Normal bir CREATE INDEX işlemi SHARE kilidi alır; dizin oluşturma işleminin tamamı boyunca yazma işlemlerini engeller, ancak okumaları engellemez. Milyarlarca satırlık bir tabloda bu, dakikalarca süren bir yazma kesintisi anlamına gelir.

CONCURRENTLY: Çözüm

CREATE INDEX CONCURRENTLY, yazma işlemlerini engellemeden dizini oluşturur:

CREATE INDEX CONCURRENTLY idx_orders_user_id ON orders(user_id);

Nasıl Çalışır

İki tablo taraması yapılır:

  1. İlk geçiş: dizini mevcut satırlardan oluşturur
  2. İkinci geçiş: ilk geçiş sırasında değiştirilen satırları yakalar

Ayrıca oluşturma işleminden önce başlayan eşzamanlı işlemler için kısa bir bekleme yapılır.

İşlem İçinde Çalıştırılamaz

CONCURRENTLY iki kez COMMIT yapar; bu nedenle açık bir BEGIN/COMMIT bloğunun içinde çalıştırılamaz:

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

Yavaş ama Çevrimiçi

CONCURRENTLY, normal bir CREATE INDEX işleminden daha uzun sürer; bunun nedenleri iki tarama yapılması ve kilitlerin beklenmesidir. Avantajı ise hiç kesinti yaşanmamasıdır.

Hatalardan Kurtarma

CONCURRENTLY başarısız olursa (işlem kesilirse veya sistem hatası oluşursa) dizin INVALID durumunda bırakılır:

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

PG 12'den itibaren engelleme olmadan yeniden oluşturma:

REINDEX INDEX CONCURRENTLY orders_user_id_idx;
REINDEX TABLE CONCURRENTLY orders;

DROP INDEX CONCURRENTLY

Bu işlem de engelleme yapmaz:

DROP INDEX CONCURRENTLY old_idx;

Benzersiz Dizinler

UNIQUE dizinleri de CONCURRENTLY kullanılarak oluşturulabilir. UNIQUE kısıtlarını çevrimiçi eklemek için kullanışlıdır:

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

Yabancı Anahtar Dizinleri

Büyük bir tabloya FK eklerken kullanılan standart yöntem:

-- 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;

Eşzamanlı Dizin Oluşturmanın Maliyeti

İki tam tablo taraması ve kayıt tutma işlemi yapılır. CPU ve IO kaynaklarını tüketir. Mümkünse düşük trafik saatlerinde çalıştırın.

İlerlemeyi İzleme

PG 12 ve sonraki sürümler, ilerleme bilgisini pg_stat_progress_create_index üzerinden sunar:

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

Özet

CONCURRENTLY, üretim ortamında dizinleri yönetmenin uygun yoludur.

  • CREATE/DROP/REINDEX CONCURRENTLY yazma işlemlerini engellemez
  • Bir işlemin içinde çalıştırılamaz
  • Hatalar INVALID dizinler bırakır; bunları temizleyin
  • pg_stat_progress_create_index ile izleyin

Hızlı Kontrol

CREATE INDEX CONCURRENTLY neden açık bir BEGIN/COMMIT bloğunun içinde çalıştırılamaz?

Sıkça Sorulan Sorular

“Eşzamanlı INDEX'ler (CREATE INDEX CONCURRENTLY)” dersi ücretsiz mi?

Evet — “Eşzamanlı INDEX'ler (CREATE INDEX CONCURRENTLY)” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.

“Eşzamanlı INDEX'ler (CREATE INDEX CONCURRENTLY)” dersinde ne öğreneceğim?

CREATE INDEX CONCURRENTLY kullanarak yazma işlemlerini engellemeden INDEX'ler oluşturun ve kesintiye uğrayan oluşturma işlemlerini kurtarın. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Eşzamanlı INDEX'ler (CREATE INDEX CONCURRENTLY)” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Çevrimiçi Geçişler: ALTER TABLE Neden Kilitler
  2. Eşzamanlı INDEX'ler (CREATE INDEX CONCURRENTLY)
  3. Kesinti Olmadan Sütun Adı Değiştirme
  4. Araçlar: Flyway, Liquibase, Sqitch
← SQL Academy Sayfasına Dön