Deneyimlerimi paylaşmak istiyorum. Birkaç gün önce, 76 milyon kayıtla tabloda 21 milyon kayıt güncellemeliyim. Meslektaşım bir sonraki varyantı önerdi.
Id | FirstName | LastName | Email | JobTitle
1 | John | Doe | [email protected] | Software Developer
2 | John1 | Doe1 | [email protected] | Software Developer
3 | John2 | Doe2 | [email protected] | Web Designer
Görev: Yeni İş Ünvanı Güncelleme kişileri: -> 'Web Geliştirici' 'Yazılım Geliştirici' Örneğin, bir sonraki tabloyu 'Kişiler' var.
1. Geçici Tablo 'Persons_SoftwareDeveloper_To_WebDeveloper (id INT birincil anahtar)' Yeni İş Başlığı ile güncelleştirmek istediğiniz geçici tablo kişilerin içine
2. Seç oluşturun:
INSERT INTO Persons_SoftwareDeveloper_To_WebDeveloper SELECT Id FROM
Persons WITH(NOLOCK) --avoid lock
WHERE JobTitle = 'Software Developer'
OPTION(MAXDOP 1) -- use only one core
Satır sayısına bağlı olarak, bu ifadenin geçici tablonuzu doldurması biraz zaman alacaktır, ancak kilitlenmeyi önler. Benim durumumda yaklaşık 5 dakika sürdü (21 milyon satır).
3. ana fikir veritabanını güncellemek için mikro sql ifadeleri üretmektir. Yani, onları baskı atalım:
DECLARE @i INT, @pagesize INT, @totalPersons INT
SET @i=0
SET @pagesize=2000
SELECT @totalPersons = MAX(Id) FROM Persons
while @i<= @totalPersons
begin
Print '
UPDATE persons
SET persons.JobTitle = ''ASP.NET Developer''
FROM Persons_SoftwareDeveloper_To_WebDeveloper tmp
JOIN Persons persons ON tmp.Id = persons.Id
where persons.Id between '+cast(@i as varchar(20)) +' and '+cast(@[email protected] as varchar(20)) +'
PRINT ''Page ' + cast((@i/@pageSize) as varchar(20)) + ' of ' + cast(@totalPersons/@pageSize as varchar(20))+'
GO
'
set @[email protected][email protected]
end
Bu komut dosyasını çalıştırmadan sonra MS SQL Management Studio biri sekmede yürütebileceği toplu yüzlerce alacaktır.
4. Yazdırılan sql deyimlerini çalıştırın ve tablodaki kilitleri kontrol edin. İşlemi her zaman durdurabilir ve güncelleştirmeyi hızlandırmak veya hızlandırmak için @ pageSize ile oynayabilirsiniz (komut dosyasını duraklattıktan sonra @i'u değiştirmeyi unutmayın).
5. Drop Persons_SoftwareDeveloper_To_AspNetDeveloper. Geçici tabloyu kaldırın.
Küçük Not: Bu geçiş, bir süre alabilir ve geçiş sırasında geçersiz veriler içeren yeni satırlar eklenebilir. Yani, öncelikle satırların eklediği yerleri düzeltin. Durumumda UI, 'Yazılım Geliştirici' -> 'Web Geliştiricisi'ni kurdum.
Sorgu2'de sorun nedir? –
Böyle bir şekilde ROWCOUNT kullanmayın. Bu kullanımdan kaldırılmıştır. https://msdn.microsoft.com/en-us/library/ms188774.aspx –
@JuanCarlosOropeza Komut başarıyla tamamlanmış olarak geliyor ama gerçekte kayıtların hiçbiri güncellenmiyor. – CSharper