Hej. Testa det här. Borde du inte kunna lägga till alla tre kolumner i en ALTER TABLE sats? Jo det går alldeles utmärkt, ser ut såhär: Tack för era tips. Varför jag använde EXEC är bara för att det är en standard vi använder sen gammalt. I alla fall, hur jag än testar går det grymt segt. Nu är det en enorm mängd rader i tabellen (nästan 100 000 000) och dessutom kör jag på en virtuell maskin där man inta är riktigt säker på hur mycket resurser man får. Lite frustrerande.......... Den "standarden" tycker jag ni ska överge...Skapa nya fält i en gigantisk tabell - prestandaproblem
Jag har en tabell (i en sql server 2008) som innehåller miljontals med poster. Nu ska jag lägga till 3 fält till den. Eftersom dom måste deklareras som NOT NULL (dom är för övrigt decimala 15,4), så måste alla initieras med ett värde samtidigt. Så, när jag körde följande:
IF NOT EXISTS (SELECT * FROM syscolumns WHERE name = 'mittForstaNyaFaelt' AND id = object_id('dbo.minDatabas'))
BEGIN
EXEC ('ALTER minDatabas ADD mittForstaNyaFaelt decimal(15, 4) NOT NULL DEFAULT 0')
END
ELSE
PRINT 'Kolumn mittForstaNyaFaelt i tabell minDatabas fanns redan, ej tillagd!'
GO
Och sen samma för de andra 2 nya fälten, så tog det en evighet, typ 4 dygn, och det är inte accepabelt. Dessutom så växte loggfilen något groteskt. Finns det något knep för att snabba upp detta? Jag funderar på t.ex. att ta det i mindre bitar, typ 2000 poster i taget eller så, men vet inte om det kommer snabba upp det. Transaktionsloggen bör väl i alla fall bli lite mindre.Sv: Skapa nya fält i en gigantisk tabell - prestandaproblem
(håller loggfilen på mattan också)
<code>
ALTER DATABASE [din databas] SET RECOVERY SIMPLE;
GO
ALTER TABLE [din tabell] ADD [din kolumn] decimal(15, 4) NOT NULL DEFAULT 0;
GO
ALTER DATABASE [din databas] SET RECOVERY FULL;
GO
</code>
Varför använde du EXEC för detta?
Tog ca 12 minuter på en tabell med 2,9 miljoner rader.Sv:Skapa nya fält i en gigantisk tabell - prestandaproblem
ALTER minDatabas
ADD mittForstaNyaFaelt decimal(15, 4) NOT NULL DEFAULT 0,
ADD mittAndraNyaFaelt decimal(15, 4) NOT NULL DEFAULT 0,
ADD mittTredjeNyaFaelt decimal(15, 4) NOT NULL DEFAULT 0
Sv: Skapa nya fält i en gigantisk tabell - prestandaproblem
<code>
ALTER DATABASE [din databas] SET RECOVERY SIMPLE;
GO
ALTER TABLE [din tabell] ADD
[din kolumn1] decimal(15, 4) NOT NULL DEFAULT 0,
[din kolumn2] decimal(15, 4) NOT NULL DEFAULT 0,
[din kolumn3] decimal(15, 4) NOT NULL DEFAULT 0;
ALTER DATABASE [din databas] SET RECOVERY FULL;
GO
</code>
EDIT: Ovanstående tog 15,4 minuter på 2,9 miljoner rader. Sv: Skapa nya fält i en gigantisk tabell - prestandaproblem
Sv:Skapa nya fält i en gigantisk tabell - prestandaproblem
En annan lösning skulle vara att skapa en tom tabell med de nya raderna (annat namn).
BULK COPY raderna från originaltabellen, och sedan "droppa", den "gamla".
Döp om den nya tabellen till samma som den gamla.