![](/img/trans.png)
[英]MS SQL log size is not enough or "the transaction log for database is full due to 'active_transaction'."
[英]SQL Server Log full due to active transaction
我一直在嘗試更新表中的列,但出現以下錯誤:
由於“ACTIVE_TRANSACTION”,數據庫“STAGING”的事務日志已滿。
我正在嘗試運行以下語句:
UPDATE [STAGING].[dbo].[Stg_Encounter_Alias]
SET
[valid_flag] = 1
FROM [Stg_Encounter_Alias] Stg_ea
where [ACTIVE_IND] = 1
and [END_EFFECTIVE_DT_TM] > convert(date,GETDATE())
我的表有大約 1800 萬行。 並且上面的更新會修改所有的行。 表大小為 2.5 GB。 數據庫也處於簡單恢復模式
這是我會在不同的桌子上經常做的事情。 我該如何管理?
我的數據庫大小如下
以下是數據庫屬性!!! 我嘗試將日志大小更改為無限制,但它又恢復為默認值。
誰能告訴我處理這種情況的有效方法?
如果我分批運行:
begin
DECLARE @COUNT INT
SET @COUNT = 0
SET NOCOUNT ON;
DECLARE @Rows INT,
@BatchSize INT; -- keep below 5000 to be safe
SET @BatchSize = 2000;
SET @Rows = @BatchSize; -- initialize just to enter the loop
WHILE (@Rows = @BatchSize)
BEGIN
UPDATE TOP (@BatchSize) [STAGING].[dbo].[Stg_Encounter_Alias]
SET
[valid_flag] = 1
FROM [Stg_Encounter_Alias] Stg_ea
where [ACTIVE_IND] = 1
and [END_EFFECTIVE_DT_TM] > convert(date,GETDATE())
SET @Rows = @@ROWCOUNT;
END;
end
您在單個事務中執行更新,這會導致事務日志變得非常大。
相反,請分批執行更新,例如一次 50K - 100K。
您在END_EFFECTIVE_DT_TM
上是否有包含ACTIVE_IND
和valid_flag
的索引? 這將有助於表現。
CREATE INDEX NC_Stg_Encounter_Alias_END_EFFECTIVE_DT_TM_I_
ON [dbo].[Stg_Encounter_Alias](END_EFFECTIVE_DT_TM)
INCLUDE (valid_flag)
WHERE ([ACTIVE_IND] = 1);
如果您運行的是 Enterprise Edition OR SQL Server 2016 SP1 或更高版本(任何版本),另一件可以顯着提高性能的事情是為表及其索引打開data_compression = page
。
謝謝你的幫助米奇。 我實際上已經增加了事務日志大小並刪除了所有索引作為其臨時數據庫。 它在24s內更新了1700萬行:)
雖然我對解決方案不是很滿意,但由於時間不夠,我會更進一步。 我將不得不進一步研究效率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.