Untuk meringkas spesifikasinya: Kita perlu memasukkan sekitar 5 juta baris ke dalam database vendor (Oracle). Semuanya berjalan baik untuk kumpulan 500k baris menggunakan OracleBulkCopy
(ODP.NET), tetapi ketika kami mencoba untuk skala hingga 5M, kinerja mulai melambat ke perayapan setelah menyentuh tanda 1M, semakin lambat karena semakin banyak baris dimuat, dan akhirnya habis setelah 3 jam atau lebih.
Saya menduga itu terkait dengan kunci utama di atas meja, tapi aku sudah trawl forum Oracle dan Stack Overflow untuk informasi dan banyak apa yang saya baca bertentangan itu (juga, banyak posting tampaknya bertentangan satu sama lain ) . Saya berharap seseorang dapat meluruskan beberapa pertanyaan terkait erat tentang proses:
Apakah
OracleBulkCopy
kelas menggunakan pemuatan jalur konvensional atau langsung? Apakah ada cara saya dapat mengkonfirmasi ini, dengan satu atau lain cara?Dengan asumsi itu tidak digunakan langsung jalan memuat: Apakah benar bahwa Oracle secara otomatis mengatur semua indeks untuk dapat digunakan selama beban dan menempatkan mereka kembali online sesudahnya? Saya telah membaca beberapa pernyataan untuk efek ini tetapi sekali lagi, tidak dapat mengonfirmasinya.
Jika # 2 benar, maka haruskah membuat perbedaan indeks apa yang ada di meja sebelum saya memulai operasi salinan massal? Jika demikian, mengapa?
Terkait dengan # 3, apakah ada perbedaan praktis, secara umum, antara pemuatan massal dengan indeks yang tidak dapat digunakan vs benar-benar menjatuhkan indeks sebelum memuat dan membuatnya kembali sesudahnya?
Jika # 2 tidak benar, atau jika ada beberapa peringatan yang saya tidak mengerti, maka apakah ada bedanya untuk secara eksplisit membuat indeks tidak dapat digunakan sebelum memuat massal, dan kemudian secara eksplisit membangunnya kembali setelah itu?
Apakah ada hal lain, selain pembuatan indeks, yang dapat menyebabkan operasi salinan massal tumbuh semakin lambat karena semakin banyak catatan ditambahkan? (Mungkin ada hubungannya dengan logging, walaupun saya berharap operasi massal tidak dicatat?)
Jika benar-benar tidak ada cara lain untuk meningkatkan kinerja selain menjatuhkan PK / indeks terlebih dahulu, langkah-langkah apa yang dapat saya ambil untuk memastikan bahwa indeks tidak sepenuhnya hilang, yaitu jika koneksi ke database terputus di tengah proses?