2013-10-25 164 views
2

我希望這不是脫離主題,但我有一個真正的問題,我oculd使用一些建議。Sql Server問題

我有一個應用程序在啓動時升級自己的Sql Server數據庫(從以前的版本)。通常這很好,但是新版本必須改變幾個nvarchar列的寬度。

對於表中有大量數據的實時數據庫,這需要很長時間。似乎有兩個問題 - 一個是Sql Server似乎正在處理數據(可能重寫它),儘管實際上並沒有改變,另一個是事務日誌吞噬了大量的空間。

有什麼辦法可以規避這個問題嗎?它只是一個簡單的Alter Table ... Alter Column命令,將nvarchar(x)更改爲nvarchar(x + n),沒有什麼奇怪的,但是它在該領域造成了一個'問題'並引起很大的不滿。如果有一種方法可以在不處理現有數據的情況下更改列寬,並以某種方式抑制事務日誌內容,那將很方便。

它似乎沒有與Oracle數據庫的問題。

一個例子命令:

IF EXISTS (SELECT 1 FROM information_schema.COLUMNS WHERE table_name='ResourceBookings' AND column_name = ('ResourceBookerKey1') AND character_maximum_length <= 50) 
    ALTER TABLE [ResourceBookings] ALTER COLUMN [ResourceBookerKey1] NVARCHAR(80) NULL 

正如你可以看到,該表只改變,如果列的寬度需要增加

TIA

+0

我知道你所描述的代碼,但它可能仍然是有用的張貼實際的代碼。 –

+0

聽起來你有一些頁面拆分正在進行,但我不認爲這將是必要的VAR。 – Paparazzi

+0

這個字段是否有索引? – valex

回答

1

升級之前,請確保在SQL Server數據庫的恢復模式設置爲「簡單」。轉到SSMS,右鍵單擊數據庫,選擇屬性,然後單擊選項頁面。記錄「恢復模式」值。如果還沒有(我假設它設置爲FULL),則將恢復模型設置爲「簡單」。

然後運行升級。升級之後,您可以將該值恢復到原來的值。

或者你可以用這樣的腳本是:

升級之前:

升級
ALTER DATABASE MyDatabase SET RECOVERY SIMPLE; 

後:

ALTER DATABASE MyDatabase SET RECOVERY FULL;