Saya menerapkan fitur aplikasi impor data spesifik dari satu database ke yang lain.
Saya memiliki file CSV yang berisi katakanlah 10.000 baris. Baris-baris ini perlu dimasukkan / diperbarui ke dalam basis data.
Mungkin ada kasusnya, di mana beberapa baris mungkin ada dalam database yang berarti mereka perlu diperbarui. Jika tidak ada dalam database, itu harus dimasukkan.
Salah satu solusi yang mungkin adalah bahwa, saya dapat membaca satu per satu baris, memeriksa entri dalam database dan membangun permintaan masukkan / pembaruan yang sesuai. Tetapi proses ini mungkin membutuhkan banyak waktu untuk membuat pembaruan / menyisipkan kueri dan menjalankannya dalam database. Beberapa kali file CSV saya mungkin memiliki jutaan catatan.
Apakah ada cara lain yang lebih cepat untuk mencapai fitur ini?
OutOfMemory
!Jawaban:
Ada teknologi bagus yang tersedia di Oracle yang disebut Tabel Eksternal. Dalam skenario Anda, Anda bisa mengakses data teks biasa eksternal Anda menggunakan Tabel Eksternal dari dalam database dan memperbarui data yang ada dalam database dengan pernyataan SQL yang Anda sukai dan digunakan untuk - misalnya
INSERT
,MERGE
dll.Dalam kebanyakan kasus, menggunakan utilitas yang disediakan Oracle adalah cara terbaik untuk melakukan ETL. Dan karena pertanyaan Anda terdengar seperti pertanyaan administratif, saya sarankan Anda untuk melihat posting saya sebelumnya di DBA Stack Exchange "Perbarui database Oracle dari CSV" .
PEMBARUAN: Pendekatan ini berfungsi cukup baik untuk membaca data eksternal dalam database. Secara umum, Anda menentukan format data eksternal setiap kali Anda perlu memproses file teks biasa yang memiliki format baru. Setelah tabel eksternal dibuat, Anda dapat menanyakannya seperti tabel database nyata. Setiap kali ada data baru untuk diimpor, Anda cukup mengganti file yang mendasarinya dengan cepat tanpa perlu membuat ulang tabel eksternal. Karena tabel eksternal dapat dikenali sebagai tabel database lainnya, Anda dapat menulis pernyataan SQL untuk mengisi tabel database lainnya.
Biaya tambahan untuk menggunakan Tabel Eksternal biasanya lebih rendah dibandingkan dengan teknik lain yang akan Anda terapkan secara manual karena teknologi ini dirancang dengan mempertimbangkan kinerja arsitektur Oracle Database.
sumber
Saya pikir Anda harus menggunakan SQL * Loader untuk memuat file CSV ke tabel sementara dan kemudian menggunakan pernyataan MERGE untuk memasukkan data ke dalam tabel kerja.
SQL * Loader akan memberi Anda lebih banyak fleksibilitas daripada tabel eksternal dan jika seseorang menggunakan load path langsung, ia sangat cepat. Dan MERGE akan melakukan apa yang Anda butuhkan - Sisipkan catatan baru dan perbarui yang sudah ada.
Beberapa tautan untuk memulai:
http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_concepts.htm
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016 .htm
sumber
PreparedStatements akan membuat pembuatan memasukkan atau memperbarui kueri sangat cepat. Anda harus memiliki tiga
PreparedStatements
: Satu untuk disisipkan, satu untuk pembaruan, dan satu untuk memeriksa apakah baris sudah ada dalam tabel. Jika Anda dapat menjaga ID yang sama antara file CSV dan database baru, maka memeriksa untuk melihat apakah ada baris menggunakan bidang primaryID juga harus sangat cepat.Menggunakan bets insert dapat menawarkan peningkatan kinerja. Ketika Anda melakukan streaming melalui file CSV, Anda kemudian akan memeriksa apakah baris sudah ada di sana dan kemudian melakukan pembaruan atau menambahkan baris ke perintah masukkan batch Anda. Anda harus memeriksa pertanyaan SO ini untuk perbandingan kecepatan kedua pendekatan ini.
Jika impor basis data ini adalah sesuatu yang perlu dilakukan secara teratur dan kinerja adalah masalah menggunakan metode yang saya uraikan di atas, maka Anda dapat mencoba menangani tugas dengan beberapa utas pekerja. Gunakan sebanyak mungkin utas sebagai pengolah pada mesin yang menjalankan kode ini.
Setiap utas mendapatkan koneksi DB sendiri dan karena kode Anda berulang melalui file, garis CSV dapat diserahkan ke berbagai utas. Ini jauh lebih rumit, jadi saya hanya akan melakukan ini jika persyaratan kinerja memaksa saya untuk melakukannya.
sumber