2012-02-13 1 views
5

Çalıştığım şirketin, işlemlerle her 10 saniyede bir yazılı olan büyük günlük/günlük tabloları var. Bu tablodaki bir çok veriyi kopyalamak ve bu tablodan silmek istiyorum çünkü eski verilerin yaklaşık% 75'i bir arşiv tablosuna veya başka bir şeye konabilir, ancak eğer yanlış yaparsam ve masa kilitlenirse yukarı bir felaket olurdu.Büyük bir üretim tablosundan veri kopyalama

bir adam böyle bir şey ile geldi bir önceki soruya

, ben beni güvende tutmak için yeterli nolock ipucu ve tüm yazma gayet güzel çalışıyor, bu her şeyi berbat olmaz bilmek istiyorum? Eğer değilse, ne yapmalıyım?

set identity_insert newtable on 
DECLARE @StartID bigint, @LastID bigint, @EndID bigint 
select @StartID = max(id)+1 
from newtable 

select @LastID = max(ID) 
from oldtable 

while @StartID < @LastID 
begin 
set @EndID = @StartID + 1000000 

insert into newtable (FIELDS,GO,HERE) 
select FIELDS,GO,HERE from oldtable (NOLOCK) 
where id BETWEEN @StartID AND @EndId 

set @StartID = @EndID + 1 
end 
set identity_insert newtable off 
go 
+1

Bu, eski kayıtların SİLİNMESİ için planınız dışında harika bir şey mi? Gerçekten bir çeşit kilitlenme olmadan bunu yapmanın bir yolu değil. – JNK

+0

Evet, soruyu biraz açıklığa kavuşturdum, bu yüzden eski db işlemlerini silmenin en iyi yolu nedir? –

cevap

3

Listenizi oluştururken son derece dikkatli olun, ancak toplu bir silme çalıştırmak isteyeceksiniz.

INSERT için muhtemelen WHILE döngüsüne ihtiyacınız yoktur. DELETE için olsa da, böyle bir şey (melodi ihtiyaçlarınıza parti boyutu) kullanır:

WHILE 1=1 
BEGIN 
    DELETE TOP (10000) o 
    FROM OldTable o 
    INNER JOIN NewTable N 
     ON o.id = n.id 
    IF @@ROWCOUNT < 10000 BREAK; 
END 

Bu işlem sürece silmek kayıtları olduğu gibi bir defada DELETE 10k kayıtları.

+0

parçası olabilir geçmişte benzer bir şey büyük bir tablo ile yaptım, toplu olarak kayıtları arşivleme ve silme . Temel olarak kodunuza benziyordu, ancak "loop yapmaya başla" ve "while tran" ile while döngüsünde. Sonra yedekledim, kesilmiş ve kütüğü daraltmıştım. –

+0

Eğer çekişme konusunda endişelenirse, bu işlem masayı kilitleyeceğinden bir işlem yapmazdım :) – JNK

+0

Teşekkürler JNK, bu yüzden önce kopyayı yapmamı ve sonra silme işlemini yapmanızı tavsiye eder misiniz? Endişelenmem gereken başka bir şey var mı? Üzgünüm, sadece süper paranoyakım ama sanırım işe yarayacak gibi görünüyor. –

0

Seçeneklerden biri saate göre tablo parçalamaktır (bunu her bir ek üzerine GETDATE() varsayılan tablosunda bir DATETIME sütun olduğu varsayıldığında). Bölümlere sahip olmak, geçerli bölümü etkilemeden eski bölümlerde bakım (bırakma, kopyalama, vb.) Gerçekleştirmenizi sağlar.

+1

Tabloyu seçmek için yeterince uzun kilitleme endişesi var ve bir bölümleme şeması eklemeyi mi öneriyorsunuz? Oldukça emin bazı kilitleme neden olacak ... – JNK

+0

@JNK evet ama bu gelecekte planlanan bir kesinti –

İlgili konular