Tek bir tabloda 100 milyon kayıt güncellemeliyim, aslında, bir sütunun varchar değerini sadece bir ID ile değiştirerek tabloyu normalleştiriyorum. ("Değiştiriyorum" diyorum ama gerçekten kimliği başka bir sütuna yazıyorum.)
Elde etmeye çalıştığım, veri kümesini normalleştirmek. Henüz normalleştirilmemiş verilerin indekslenmesi yoktur. Benim düşüncem, güncelleme tamamlandıktan sonra varchar değerlerini tinyint değerleriyle değiştirecek yabancı anahtarları endekslemek için beklemek yerine ham değerler üzerinde dizinler oluşturmayacağımdı.
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
Arka fon
- 2008 R2 üzerinde MSSQL 2008 R2 kullanma
- Sunucuda 8 GB RAM var
- sunucunun bir RAID10, 7200 RPM SATA'sı var (çok iyi değil, biliyorum, üretimde bu sadece verileri okuyacak ve veri yazmayacak; artı son HD sıkıntısı bunu maliyet için gerekli hale getirdi)
- sunucusu çift dört çekirdekli Xeon CPU'ya sahip
- Makine başka bir şey yapmıyor (şu anda geliştirmeye adanmış, sadece bu işlem)
- basit günlük kaydı açıldı (? - ancak geri dönebilmesi için hala günlüğe kaydediliyor mu?)
- sorgunun değerine göre iki farklı DB'ye başvurduğunu unutmayın
- güncellenen tablodaki bir kaydın "genişliği" 455 bayt
Yürütme Sırasında Kaynaklar
- fiziksel RAM maksimum
- disk G / Ç maks.
- CPU neredeyse hiçbir şey yapmıyor (boğulma noktası G / Ç)
- çalışma süresi 14 saat oldu ve sayılıyor!
Normalleştirme güncellemelerinden sonra sütunu (AutoClassName) bırakacak olsam bile, ham verilerde bir dizine ihtiyacım var gibi birkaç şeyden şüpheleniyorum. Ayrıca, bunu başlattığımda saçma görünen JOIN yerine masayı bir kerede bir rekor kırabilir miyim, ama şimdi daha hızlı olurdu gibi görünüyor.
Kalan normalleştirme güncellemelerim (buna benzer) için yöntemimi daha hızlı bir şekilde nasıl değiştirmeliyim?
TOP. Benim yaklaşımım bu olurdu.