在 Alter Table 期間用完事務日誌空間
我正在執行一個更改表,更改一個具有近 3000 萬行的表上的列,並且 SQL Azure 在大約 18 分鐘後失敗了
The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.
我猜不可能將其分解為一次修改更少的行,所以我想知道我的選擇是什麼來對數據庫進行這種更改。SQL Azure 不允許我更改事務日誌的大小(限制為 1gb)。
我猜我最好的選擇是使用新佈局創建一個新表,將數據遷移到該表中,刪除原始表,然後重命名新表以匹配舊表的名稱。如果是這種情況,最好如何建構這些命令?
我們系統的計劃停機時間目前不是問題,因此此操作可能需要盡可能長的時間。
您需要將數據載入到新表中,分小批執行此操作,然後刪除現有表。我使用 AdventureWorks 中的 Sales.Customer 表整理了一個快速範例,類似的東西也應該適用於您。
首先,創建您的新表,並填寫您要使用的新數據類型:
CREATE TABLE [Sales].[Currency_New]( [CurrencyCode] [nchar](4) NOT NULL, [Name] [varchar](128) NOT NULL, [ModifiedDate] [datetime] NOT NULL, CONSTRAINT [PK_Currency_New_CurrencyCode] PRIMARY KEY CLUSTERED ( [CurrencyCode] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ) GO
然後,插入您的記錄並定義您的批次。我在這裡使用 10,但您可能想要使用更大的東西,比如一次 10,000 行。對於 30MM 行,我什至建議您一次使用 100k 行批量大小,這是我通常用於較大表的限制:
DECLARE @RowsInserted INT, @InsertVolume INT SET @RowsInserted = 1 SET @InsertVolume = 10 --Set to # of rows WHILE @RowsInserted > 0 BEGIN INSERT INTO [Sales].[Currency_New] ([CurrencyCode] ,[Name] ,[ModifiedDate]) SELECT TOP (@InsertVolume) SC.[CurrencyCode] ,SC.[Name] ,SC.[ModifiedDate] FROM [Sales].[Currency] AS SC LEFT JOIN [Sales].[Currency_New] AS SCN ON SC.[CurrencyCode] = SCN.[CurrencyCode] WHERE SCN.[CurrencyCode] IS NULL SET @RowsInserted = @@ROWCOUNT END
我通常會在清理之前進行完整性檢查並驗證行數是否相同:
SELECT COUNT(*) FROM [Sales].[Currency] SELECT COUNT(*) FROM [Sales].[Currency_New]
一旦你確信你已經遷移了你的數據,你可以刪除原始表:
DROP TABLE [Sales].[Currency]
最後一步,重命名新表,這樣使用者就不必更改任何程式碼:
EXEC sp_rename '[Sales].[Currency_New]', '[Sales].[Currency]'; GO
我不知道這需要多長時間。我建議您在有明確的維護視窗並且未連接使用者時嘗試這樣做。
高溫高壓
我現在正在打電話,但幾天前我剛剛在 StackOverflow 上回答了一個非常相似的問題。列名可能不適用於您,但這是我給出的。
SELECT [ID], [Title], [Abstract], [Value], [UserID], [GroupID], [Date], [Views], [Hates], [Likes], [Source] INTO dbo.[News-News_Newest] FROM [dbo].[News-News]; DROP TABLE [dbo].[News-News_Newest]; GO EXEC sp_rename '[News-News_Newest]' , '[News-News]'; GO ALTER TABLE [News-News] ADD CONSTRAINT PK_News_ID PRIMARY KEY CLUSTERED (ID ASC);
與我們一樣,同樣的警告也適用於您。腳本出你的外鍵關係,然後重建。載入後檢查檢查