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

Kendala UNIK vs pemeriksaan sebelum INSERT

Saya pikir sebagian besar kasus perbedaan antara keduanya akan cukup kecil sehingga pilihan sebagian besar harus didorong dengan memilih implementasi yang akhirnya paling dapat dimengerti oleh seseorang yang melihat kode untuk pertama kalinya.

Namun, saya pikir penanganan pengecualian memiliki beberapa kecil kelebihan:

  • Penanganan pengecualian menghindari kondisi balapan yang potensial. Metode 'periksa, lalu sisipkan' mungkin gagal jika proses lain menyisipkan catatan antara cek dan sisipan Anda. Jadi, bahkan jika Anda melakukan 'periksa lalu sisipkan', Anda masih menginginkan penanganan pengecualian pada sisipan dan jika Anda sudah melakukan penanganan pengecualian, sebaiknya Anda menghapus pemeriksaan awal.

  • Jika kode Anda bukan prosedur tersimpan dan harus berinteraksi dengan database melalui jaringan (yaitu aplikasi dan db tidak berada di kotak yang sama), maka Anda ingin menghindari dua panggilan jaringan terpisah (satu untuk pemeriksaan dan lainnya untuk penyisipan) dan melakukannya melalui penanganan pengecualian menyediakan cara langsung untuk menangani semuanya dengan satu panggilan jaringan. Sekarang, ada banyak cara untuk melakukan metode 'periksa lalu masukkan' sambil tetap menghindari panggilan jaringan kedua, tetapi menangkap pengecualian mungkin merupakan cara paling sederhana untuk melakukannya.

Di sisi lain, penanganan pengecualian memerlukan batasan unik (yang benar-benar merupakan indeks unik), yang disertai dengan kompromi kinerja:

  • Membuat batasan unik akan lambat pada tabel yang sangat besar dan akan menyebabkan hit kinerja pada setiap sisipan ke tabel itu. Pada database yang benar-benar besar, Anda juga harus menganggarkan ruang disk ekstra yang digunakan oleh indeks unik yang digunakan untuk menegakkan batasan.
  • Di sisi lain, pemilihan dari tabel mungkin lebih cepat jika kueri Anda dapat memanfaatkan indeks tersebut.

Saya juga mencatat bahwa jika Anda berada dalam situasi di mana yang sebenarnya ingin Anda lakukan adalah 'memperbarui sisipan lain' (yaitu jika catatan dengan nilai unik sudah ada maka Anda ingin memperbarui catatan itu, jika tidak, Anda memasukkan yang baru record) maka yang sebenarnya ingin Anda gunakan adalah metode UPSERT basis data khusus Anda, jika ada. Untuk SQL Server dan Oracle, ini akan menjadi pernyataan MERGE.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memperbaiki kesalahan ORA-65096 saat membuat tes otomatis di Django menggunakan Oracle

  2. Apakah Oracle memiliki variabel tabel yang setara dengan SQL Server?

  3. Cara mendapatkan entri terbesar kedua atau terbesar ketiga dari sebuah tabel

  4. Apa yang setara dengan varchar(max) di Oracle?

  5. Cara Menemukan Nama Batasan di Oracle