Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

MASUKKAN 10 juta kueri di bawah 10 menit di Oracle?

Saya tahu orang lain telah menyebutkan ini dan Anda tidak ingin mendengarnya tetapi gunakan SQL*Loader atau tabel eksternal. Waktu muat rata-rata saya untuk tabel dengan lebar yang kira-kira sama adalah 12,57 detik untuk lebih dari 10m baris. Utilitas ini telah dirancang secara eksplisit untuk memuat data ke dalam database dengan cepat dan cukup bagus dalam hal itu. Ini mungkin menimbulkan beberapa penalti waktu tambahan tergantung pada format file input Anda, tetapi ada beberapa opsi dan saya jarang harus mengubah file sebelum memuat.

Jika Anda tidak mau melakukan ini, maka Anda belum perlu mengupgrade perangkat keras Anda; Anda harus menghapus setiap kemungkinan hambatan untuk memuat ini dengan cepat. Untuk menghitungnya, hapus:

  1. Indeks
  2. Pemicunya
  3. Urutan
  4. Partisi

Dengan semua ini, Anda mewajibkan database untuk melakukan lebih banyak pekerjaan dan karena Anda melakukan ini secara transaksional, Anda tidak menggunakan database secara maksimal.

Muat data ke dalam tabel terpisah, misalnya ABC_LOAD . Setelah data dimuat sepenuhnya, lakukan tunggal INSERT pernyataan ke dalam ABC.

insert into abc
select abc_seq.nextval, a.*
  from abc_load a

Ketika Anda melakukan ini (dan bahkan jika Anda tidak melakukannya) pastikan bahwa ukuran cache urutan sudah benar; mengutip:

Ketika aplikasi mengakses urutan dalam cache urutan, nomor urutan ini dibaca dengan cepat. Namun, jika aplikasi mengakses urutan yang tidak ada dalam cache, maka urutan tersebut harus dibaca dari disk ke cache sebelum nomor urut digunakan.

Jika aplikasi Anda menggunakan banyak urutan secara bersamaan, maka cache urutan Anda mungkin tidak cukup besar untuk menampung semua urutan. Dalam hal ini, akses ke nomor urut mungkin sering memerlukan pembacaan disk. Untuk akses cepat ke semua urutan, pastikan cache Anda memiliki entri yang cukup untuk menampung semua urutan yang digunakan secara bersamaan oleh aplikasi Anda.

Ini berarti bahwa jika Anda memiliki 10 utas secara bersamaan menulis 500 catatan masing-masing menggunakan urutan ini, maka Anda memerlukan ukuran cache 5.000. Dokumen ALTER SEQUENCE menyatakan cara mengubah ini:

alter sequence abc_seq cache 5000

Jika Anda mengikuti saran saya, saya akan meningkatkan ukuran cache menjadi sekitar 10.5m.

Lihat menggunakan petunjuk APPEND (lihat juga Oracle Base); ini menginstruksikan Oracle untuk menggunakan penyisipan jalur langsung, yang menambahkan data langsung ke akhir tabel daripada mencari ruang untuk meletakkannya. Anda tidak akan dapat menggunakan ini jika tabel Anda memiliki indeks tetapi Anda dapat menggunakannya di ABC_LOAD

insert /*+ append */ into ABC (SSM_ID, invocation_id , calc_id, ... )
select 'c','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'a','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'b','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'c','g',NULL, 'test', 123 , 'N', 'asdf' from dual

Jika Anda menggunakan petunjuk TAMBAHKAN; Saya akan menambahkan TRUNCATE ABC_LOAD setelah Anda memasukkan ABC jika tidak, tabel ini akan tumbuh tanpa batas. Ini seharusnya aman karena Anda akan selesai menggunakan tabel saat itu.

Anda tidak menyebutkan versi atau edisi atau Oracle yang Anda gunakan. Ada sejumlah trik kecil tambahan yang dapat Anda gunakan:

  • Oracle 12c

    Versi ini mendukung kolom identitas; Anda bisa menghilangkan urutannya sepenuhnya.

    CREATE TABLE ABC(
       seq_no         NUMBER GENERATED AS IDENTITY (increment by 5000)
    
  • Oracle 11g r2

    Jika Anda menyimpan pelatuknya; Anda dapat menetapkan nilai urutan secara langsung.

    :new.seq_no := ABC_seq.nextval;
    
  • Edisi Oracle Enterprise

    Jika Anda menggunakan Oracle Enterprise, Anda dapat mempercepat INSERT dari ABC_LOAD dengan menggunakan petunjuk PARALEL:

    insert /*+ parallel */ into abc
    select abc_seq.nextval, a.*
      from abc_load a
    

    Ini dapat menyebabkan masalah itu sendiri (terlalu banyak proses paralel dll), jadi uji. Itu mungkin bantuan untuk sisipan batch yang lebih kecil tetapi kemungkinannya kecil karena Anda akan kehilangan waktu untuk menghitung utas apa yang harus memproses apa.

tl;dr

Gunakan utilitas yang disertakan dengan database.

Jika Anda tidak dapat menggunakannya, singkirkan semua yang dapat memperlambat penyisipan dan lakukan secara massal, karena itulah keunggulan database.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menginstal paket ROracle di Windows 7?

  2. Gaji maks ke-n di Oracle

  3. Mendapatkan pegangan ke Oracle Connection asli di Hibernate 4 untuk menjalankan proses tersimpan

  4. Bagaimana saya bisa memperkenalkan beberapa kondisi di operator LIKE?

  5. Metode termudah untuk menguji Prosedur Tersimpan Oracle