SQL Academy · Lektion

Samtidiga index (CREATE INDEX CONCURRENTLY)

Skapa index utan att blockera skrivningar med CREATE INDEX CONCURRENTLY och återställ avbrutna indexbyggen.

Lektion 2 av 414 steg

Samtidiga index (CREATE INDEX CONCURRENTLY) är en gratis lektion i SQL Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för SQL Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i SQL Academy innehåller totalt 4 lektioner.

Problemet med CREATE INDEX

Ett vanligt CREATE INDEX tar ett SHARE-lås – det blockerar skrivningar (men inte läsningar) under hela uppbyggnaden. På en tabell med en miljard rader innebär det flera minuters skrivavbrott.

CONCURRENTLY: Lösningen

CREATE INDEX CONCURRENTLY bygger indexet utan att blockera skrivningar:

CREATE INDEX CONCURRENTLY idx_orders_user_id ON orders(user_id);

Så fungerar det

Två genomsökningar av tabellen:

  1. Första genomgången: bygg indexet från de aktuella raderna
  2. Andra genomgången: fånga upp rader som ändrades under den första genomgången

Dessutom krävs en kort väntan på alla samtidiga transaktioner som startade innan uppbyggnaden.

Kan inte köras i en transaktion

CONCURRENTLY genomför två commits – därför kan det inte ligga i ett explicit BEGIN/COMMIT-block:

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

Långsamt, men online

CONCURRENTLY tar längre tid än ett vanligt CREATE INDEX (två genomsökningar och väntan på lås). Fördelen är noll driftstopp.

Återställning efter fel

Om CONCURRENTLY misslyckas (på grund av avbrott eller systemfel) lämnas indexet i tillståndet 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

Bygg om utan att blockera, från och med PG 12:

REINDEX INDEX CONCURRENTLY orders_user_id_idx;
REINDEX TABLE CONCURRENTLY orders;

DROP INDEX CONCURRENTLY

Även utan blockering:

DROP INDEX CONCURRENTLY old_idx;

UNIQUE-index

UNIQUE-index kan också byggas CONCURRENTLY. Det är användbart när ni vill lägga till UNIQUE-begränsningar online:

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

Index för främmande nycklar

Standardmönster när ni lägger till en främmande nyckel (FK) i en stor tabell:

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

Kostnaden för samtidig indexuppbyggnad

Två fullständiga tabellgenomsökningar samt bokföring. Det förbrukar CPU och I/O. Kör om möjligt under timmar med låg trafik.

Övervaka förloppet

PG 12+ visar förloppet i pg_stat_progress_create_index:

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

Sammanfattning

CONCURRENTLY är det produktionsvänliga sättet att hantera index.

  • CREATE/DROP/REINDEX CONCURRENTLY blockerar inte skrivningar
  • Kan inte köras i en transaktion
  • Fel lämnar INVALID-index – städa upp dem
  • Övervaka med pg_stat_progress_create_index

Snabbtest

Varför kan CREATE INDEX CONCURRENTLY inte köras i ett explicit BEGIN/COMMIT-block?

Gratis att börja

Lär dig SQL med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
46
Lektioner
183

Vanliga frågor

Är lektionen ”Samtidiga index (CREATE INDEX CONCURRENTLY)” gratis?

Ja – hela texten till ”Samtidiga index (CREATE INDEX CONCURRENTLY)” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i SQL Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i SQL Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Samtidiga index (CREATE INDEX CONCURRENTLY)”?

Skapa index utan att blockera skrivningar med CREATE INDEX CONCURRENTLY och återställ avbrutna indexbyggen. Ni övar på SQL Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig SQL Academy?

Du behöver inga förkunskaper. Utbildningen i SQL Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Samtidiga index (CREATE INDEX CONCURRENTLY)”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här SQL Academy-lektionen?

Ja. Varje SQL Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Online-migreringar: varför ALTER TABLE låser
  2. Samtidiga index (CREATE INDEX CONCURRENTLY)
  3. Kolumnnamnsändring utan driftstopp
  4. Verktyg: Flyway, Liquibase, Sqitch
← Tillbaka till SQL Academy