700 milyon satırı aynı değere güncelleme


12

Tüm 700 milyon satır için aynı değere bir sütun ayarlamam gereken bir veri ambarı (oracle) var.

Yönetici erişimi veya bir yönetici erişimi yok, bu yüzden bu temel sql ile yapılması gerekir ve hiçbir geçici tablo oluşturur.

Daha da karmaşık olan şey, eğer 1 = 1 olduğunda basit bir güncelleme yapmaya çalışırsam, yineleme alanı kalmaz.

Şu anda çalışan şekilde bu gibi döngü:

loop
  update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
  commit;
end loop

ama bunun muhtemelen naif olduğunu ve daha hızlı ve daha zarif bir çözüm olması gerektiğini biliyorum.


Tablo bölümlenmiş mi?
Jack diyor ki topanswers.xyz

Ben inanmıyorum. Birkaç dizin vardır, ancak hiçbiri ben güncellemek sütun içerir.
17'de owook

Yanıtlar:


4

Alanınız varsa, en az geri alma / yineleme kullanarak CTAS yapabilirsiniz . Eğer herhangi bir indeksiniz varsa, bunu başka bir yolla yapmak çok yavaş olacak ve çılgın gibi bir kayıt oluşturacaktır.

İkincil indeksleri olmayan tek bir IOT veya tek bir tablo kümesi varsa, henüz güncellenmemiş alanları bulmak için tüm tabloyu yeniden taramak zorunda kalmadan parçalar halinde birincil / küme anahtarı güncellemesinde adım atabilirsiniz.

--Düzenle

İkincil bir tablo oluşturamıyorum ... Birkaç dizin var, ama hiçbiri ben güncellemek sütun içerir.

Daha sonra tabloyu indekslediğiniz bir şeyi kullanarak işlemek için parçalara ayırmanızı öneririm (tek bir sütun olsa bile, değer aralıklarına bölebilirsiniz) Bu, her yığın için bir kez yerine bir FTS yapacaktır. kodu. Çok fazla yinelemeyle yaşamak zorunda kalacaksınız ve geri alma alanınızı da sileceksiniz (bu yüzden daha sonra geri dönüş yok)

--edit2

sütun ekleyebilir / yeniden adlandırabilir / bırakabilirseniz, bunu çok verimli bir şekilde yapabilirsiniz , ancak yalnızca 11g


1
NOLOGGINGDBA'nız izin verirse, hotstandbys geçersiz kılar.
Gaius

Gerçekten de, daha sonra yapılan bir yedekleme de iyi bir fikir olacaktır - ancak bu bir depo ve depolar nologgingiçin bir araçtır
Jack diyor ki topanswers.xyz

Sadece geçici bile olsa ikincil bir tablo oluşturamıyorum, kesinlikle birincisi kadar büyük değil.
17'de owook

11g bağlantınız umut verici görünüyordu, ancak orada 60m'lik bir tablo için her satır için değeri ayarlamak zorunda kaldığı için hala korkunç derecede yavaş olduğunu görüyorum. Masamın boyutu 10 kat olduğundan, bu yöntem bir iyileştirme olmayabilir.
12'de owook

@owook no, 11g'de bu işlem hızlıdır ve "bazı tablo türleri (örneğin, LOB sütunları olmayan tablolar)" için her satırın değerini ayarlamaz . Tablonuzun bir alt kümesinde deneyin ( create table foo as select * from bar where rownum<100000)
Jack diyor denemek topanswers.xyz

1

11g kullanıyorsanız, sütunu bırakın ve varsayılan değere sahip bir NOT NULL sütunu olarak ekleyin. Bu sezgiseldir, ancak Oracle varsayılan değeri tablonun tanımında saklar ve çalışma zamanında varsayılan değeri değiştirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.