Saya punya data warehouse (oracle) di mana saya perlu mengatur kolom ke nilai yang sama untuk semua 700 juta baris.
Saya tidak memiliki akses admin, atau akses ke admin, jadi ini harus diselesaikan dengan sql dasar dan tidak ada tabel temp yang dibuat.
Masalah rumit selanjutnya adalah jika saya mencoba melakukan pembaruan sederhana di mana 1 = 1, itu kehabisan ruang redo.
Cara saya menjalankannya sekarang adalah perulangan seperti ini:
loop
update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
commit;
end loop
tapi saya tahu ini mungkin naif dan harus ada solusi yang lebih cepat dan lebih elegan.
oracle
performance
Owook
sumber
sumber
Jawaban:
Jika Anda memiliki ruang, Anda dapat CTAS menggunakan undo / redo minimal . Jika Anda memiliki indeks sama sekali, melakukannya dengan cara lain akan sangat lambat dan menghasilkan logging seperti orang gila.
Dalam kasus di mana Anda memiliki IOT tunggal tanpa indeks sekunder, atau satu cluster tabel, Anda bisa melangkah melalui pembaruan kunci primer / cluster dalam potongan tanpa harus menelusuri ulang seluruh tabel untuk menemukan bidang yang belum diperbarui.
--edit
Kemudian saya sarankan untuk memecah tabel menjadi potongan-potongan untuk diproses menggunakan sesuatu yang Anda indeks (bahkan jika itu adalah satu kolom, Anda dapat membaginya menjadi rentang nilai) Ini akan melakukan FTS satu kali, bukan satu kali untuk setiap potongan seperti pada Anda kode. Anda harus hidup dengan banyak redo dan akan menghapus ruang undo Anda juga (jadi tidak ada flashback selanjutnya)
--edit2
jika Anda dapat menambah / mengganti nama / menjatuhkan kolom, Anda dapat melakukannya dengan sangat efisien , tetapi hanya pada 11g
sumber
NOLOGGING
, itu akan membuat hotstandbys tidak valid.nologging
alat untuk gudangcreate table foo as select * from bar where rownum<100000
)Jika Anda menggunakan 11g, jatuhkan kolom dan tambahkan kembali sebagai kolom BUKAN NULL dengan nilai default. Ini kontra-intuitif, tetapi Oracle akan menyimpan nilai default dalam definisi tabel, menggantikan nilai default pada saat run time.
sumber