2012-03-28 89 views
0

我有一個1000萬記錄沒有索引的表,我試圖重複表格。我嘗試插入選擇使用左連接或不存在;但每次我都會收到違反密鑰的錯誤。另一個問題是日誌文件變得太大,事務將無法完成。我嘗試將恢復設置爲簡單,因爲建議在線,但這並沒有幫助。以下是我使用的查詢;SQL日誌文件越來越大

insert into temp(profile,feed,photo,dateadded) 
select distinct profile,feed,photo,dateadded from original as s 
    where not exists(select 1 from temp as t where t.profile=s.profile) 

這只是產生違規的關鍵錯誤。我嘗試使用以下物質:

insert into temp(profile,feed,photo,dateadded) 
select distinct profile,feed,photo,dateadded from original as s 
left outer join temp t on t.profile=s.profile where t.profile is null 

在這兩種情況下,現在的日誌文件中的交易完成之前填滿。所以我的主要問題是關於日誌文件,我可以找出與查詢的重複。

回答

2

您可能需要分批工作。編寫一個循環遍歷5000次(你可以試驗一下這個數字,我必須按照500或最多50,000次的數量進行試驗,具體取決於數據庫以及它的繁忙程度)記錄在一次。

你的鑰匙是什麼?可能您的查詢需要選擇使用數據添加的聚合函數(使用min或max函數)。

+0

我會嘗試這個 – vbNewbie 2012-03-28 15:22:45

+0

有人告訴我,無論使用批處理的,我需要對源表這是我做的一個非聚集索引沒有,因爲它確實包含模糊。或者如何做到這一點呢? – vbNewbie 2012-03-28 15:52:22

+0

索引不一定要是唯一索引 – HLGEM 2012-03-28 17:23:20

1

事務越大,事務日誌將越大。

該日誌用於未提交的開放式事務恢復,因此如果您不是經常提交併且執行一個非常大的事務,它會導致日誌文件大幅增長。一旦提交,文件將成爲可用空間。這是爲了安全地保護數據,以防萬一發生故障並需要回滾。

我的建議是運行分批插入,每個批次後提交

+0

感謝您的回覆。你有什麼想法,爲什麼我仍然得到違反唯一的關鍵錯誤 – vbNewbie 2012-03-28 21:05:08

+0

看到這裏:http://stackoverflow.com/questions/6483699/unique-key-violation-in-sql-server -is-IT安全對承擔錯誤-2627 – 2015-11-17 05:42:50