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

Pembacaan basis data multi-utas

Jaringan

Pertama-tama, sejak menggunakan rowid dan nomor baris adalah vendor-lock, Anda harus mempertimbangkan untuk menggunakan rutinitas yang tersimpan di database. Ini dapat secara signifikan mengurangi overhead transmisi data dari database ke server aplikasi (terutama jika mereka berada di mesin yang berbeda dan terhubung melalui jaringan).

Mengingat Anda memiliki 80 juta catatan untuk dikirim, itu bisa menjadi peningkatan kinerja terbaik untuk Anda, meskipun itu tergantung pada jenis pekerjaan yang dilakukan utas Anda.

Jelas meningkatkan bandwidth juga akan membantu memecahkan masalah jaringan.

Kinerja disk

Sebelum membuat perubahan dalam kode, periksa beban hard drive saat tugas berjalan, mungkin tidak dapat menangani I/O sebanyak itu (membaca 10 thread secara bersamaan).

Migrasi ke SSD/RAID atau basis data pengelompokan mungkin menyelesaikan masalah. Saat mengubah cara Anda mengakses database tidak akan terjadi dalam kasus itu.

Multithreading dapat memecahkan masalah CPU, tetapi sebagian besar database bergantung pada sistem disk.

Rownum

Ada beberapa masalah yang mungkin Anda hadapi jika Anda akan menerapkannya menggunakan rowid dan rownum.

1) nomor baris dihasilkan dengan cepat untuk setiap hasil kueri. Jadi, jika kueri tidak memiliki pengurutan eksplisit dan ada kemungkinan bahwa beberapa record memiliki jumlah baris yang berbeda setiap kali Anda menjalankan kueri.

Misalnya Anda menjalankannya pertama kali dan mendapatkan hasil seperti ini:

some_column | rownum
____________|________
     A      |    1
     B      |    2
     C      |    3

kemudian Anda menjalankannya untuk kedua kalinya, karena Anda tidak memiliki penyortiran eksplisit, dbms (untuk beberapa alasan diketahui dengan sendirinya) memutuskan untuk mengembalikan hasil seperti ini:

some_column | rownum
____________|________
     C      |    1
     A      |    2
     B      |    3

2) poin 1 juga menyiratkan bahwa jika Anda akan memfilter hasil di rownum itu akan menghasilkan tabel sementara dengan ALL hasil dan kemudian menyaringnya

Jadi rownum bukan pilihan yang baik untuk memisahkan hasil. Sementara gaduh tampak lebih baik, ada beberapa masalah juga.

Baris

Jika Anda melihat deskripsi ROWID Anda mungkin memperhatikan bahwa "nilai baris secara unik mengidentifikasi baris di basis data ".

Karena itu dan fakta bahwa ketika Anda menghapus baris, Anda memiliki "lubang" dalam urutan rowid, rowid mungkin didistribusikan tidak merata di antara catatan tabel.

Jadi misalnya jika Anda memiliki tiga utas dan masing-masing mengambil 1.000'000 baris, ada kemungkinan bahwa satu akan mendapatkan 1.000'000 catatan dan dua lainnya masing-masing 1 catatan. Jadi satu akan kewalahan, sementara dua lainnya kelaparan .

Ini mungkin bukan masalah besar dalam kasus Anda, meskipun itu mungkin masalah yang Anda hadapi saat ini dengan pola kunci utama.

Atau jika Anda pertama-tama mengambil semua rowid di dispatcher dan kemudian membaginya secara merata (seperti yang disarankan peter.petrov) yang dapat melakukan hal itu, meskipun mengambil 80 juta id masih terdengar banyak, saya pikir akan lebih baik untuk melakukan pemisahan dengan satu sql-query yang mengembalikan batas potongan.

Atau Anda dapat menyelesaikan masalah itu dengan memberikan jumlah rowid yang rendah per tugas dan menggunakan kerangka kerja Fork-Join yang diperkenalkan di Java 7, namun seharusnya digunakan hati-hati .

Poin yang juga jelas:rownum dan rowid tidak portabel di seluruh basis data.

Jadi, jauh lebih baik untuk memiliki kolom "sharding" Anda sendiri, tetapi kemudian Anda harus memastikan diri Anda sendiri bahwa kolom itu membagi catatan dalam potongan yang kurang lebih sama.

Juga perlu diingat bahwa jika Anda akan melakukannya di beberapa utas, penting untuk memeriksa apa yang menggunakan basis data mode penguncian , mungkin itu hanya mengunci tabel untuk setiap akses, maka multithreading tidak ada gunanya.

Seperti yang disarankan orang lain, Anda sebaiknya mencari dulu apa alasan utama kinerja rendah (jaringan, disk, penguncian basis data, kekurangan utas, atau mungkin Anda hanya memiliki kueri yang kurang optimal - periksa paket kueri).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GALAT:Referensikan penghitung sebagai target tugas - PL/SQL

  2. Cara menemukan kolom kunci utama (atau unik) yang mendasarinya dari tampilan Oracle

  3. Urutan Default yang berbeda antara ORACLE dan PostgreSQL

  4. 4 Cara Menemukan Baris yang Mengandung Huruf Besar di Oracle

  5. Oracle Pl/SQL:Loop melalui node XMLTYPE