Samtidiga index (CREATE INDEX CONCURRENTLY)
Skapa index utan att blockera skrivningar med CREATE INDEX CONCURRENTLY och återställ avbrutna indexbyggen.
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:
- Första genomgången: bygg indexet från de aktuella raderna
- 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?
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
- Online-migreringar: varför ALTER TABLE låser
- Samtidiga index (CREATE INDEX CONCURRENTLY)
- Kolumnnamnsändring utan driftstopp
- Verktyg: Flyway, Liquibase, Sqitch