Saya ingin tahu cara paling efisien untuk memperbarui setiap baris dalam tabel Oracle yang sangat besar untuk satu kolom. Sebagai contoh:
update mytable set mycolumn=null;
atau:
update mytable set mycolumn=42;
Pengetahuan saya mungkin basi. Yang saya lakukan adalah mengubah tabel untuk menjatuhkan kolom. Lalu, saya mengubah tabel untuk menambahkan kolom dengan nilai default dari nilai baru yang ingin saya gunakan. Lalu, saya mengubah tabel untuk menghapus nilai default untuk kolom. Saya menemukan ini jauh lebih cepat daripada hanya menjalankan pembaruan, tetapi saya merasa ada metode yang lebih baik.
Jawaban:
Banyak tergantung pada aktivitas lain yang terjadi pada tabel ini saat Anda melakukan pembaruan massal ini. Saya harap Anda memiliki semacam lingkungan pengujian di mana Anda dapat menjalankan beberapa sampel dari apa yang ingin Anda lakukan dan mendapatkan ide tentang cara mana yang terbaik. Aku akan mencoba:
update table set column_name = blah
;updating the column=blah
dan melakukan setiap pembaruan X (mungkin 10.000). Anda dapat memparalelkan kode ini dengan menyalinnya dan membuatnya menyalin bagian terpisah dari kunci Utama.Kami memiliki masalah yang sangat mirip dengan tabel yang sangat aktif digunakan dalam sistem OLTP dan kami dapat memparalelkannya 5x dan berlari tanpa dampak penguncian pengguna pada tabel baris 100+ MM yang dilakukan setiap 10.000. Anda tidak mengatakan bagaimana Besar meja Anda atau aplikasi apa yang sedang Anda jalankan, tetapi solusi semacam ini mungkin cocok untuk Anda.
sumber
Untuk puasa
UPDATE
, pastikan Anda tidak memiliki pemicu yang diaktifkan.Pastikan untuk hanya mengaktifkan kembali yang Anda inginkan setelah selesai.
Anda mungkin juga mengalami overhead pemeliharaan indeks. Cobalah membangun kembali indeks Anda secara terpisah. Untuk melakukan itu, jawaban di sini dengan pappes harus membantu: /programming/129046/disable-and-later-enable-all-table-indexes-in-oracle
Saya mengulangi jawaban pappes di sini untuk referensi. (Perhatikan bahwa perintah SPOOL ini membuat asumsi tentang platform dan lingkungan Anda.)
Apakah mengimpor ...
sumber
hapus indeks. perbarui kolom. kembalikan indeks kembali. tetapi jika kolom berisi satu dan nilai yang sama untuk semua baris, Anda dapat menjatuhkan indeks.
sumber
Jika Anda tidak memiliki batasan ruang, Anda bisa membuat tabel baru, sama seperti tabel Anda dengan kolom baru Anda ditambahkan ke tabel itu dan menghapus tabel lama:
sumber
Coba beberapa pembaruan / komit urutan. Memasukkan / Memutakhirkan / Menghapus terlalu banyak baris tanpa komit mengarah ke beban IO yang berat. Ini dapat dioptimalkan dengan cukup mengetahui ukuran blok dan merekam ukuran dan barang-barang.
Untuk menghapus seluruh data pada sebuah tabel,
truncate table x
lebih baik daripadadelete from x
. Juga membersihkan membuat beban kerja proses lain.Sunting: Anda dapat menggunakan
inmemory
opsi, memuat tabel dalam memori dalam format berbentuk kolom dan kemudian melakukan pembaruan. itu benar-benar tergantung pada hubungan dan struktur DB Anda. Lihat artikel ini .sumber
truncate
ataudelete
akan membantu.