Hampir semua fungsi per-baris akan berdampak pada kinerja, satu-satunya pertanyaan sebenarnya adalah:"Apakah dampaknya cukup kecil untuk tidak perlu dikhawatirkan?".
Ini adalah sesuatu yang harus Anda temukan dengan mengukur daripada menebak. Administrasi basis data hanyalah aktivitas set-and-forget jika baik data maupun kueri Anda tidak pernah berubah. Jika tidak, Anda harus memantau kinerja secara berkala untuk memastikan tidak ada masalah yang terjadi.
Dengan "cukup kecil" dalam komentar di atas, maksud saya, Anda mungkin tidak perlu khawatir tentang dampak kinerja dari sesuatu seperti:
select * from friends where lowercase(lastname) = "smith"
jika Anda hanya memiliki tiga teman.
Dampak dari hal-hal ini menjadi lebih serius dengan bertambahnya ukuran meja. Misalnya, jika Anda memiliki seratus juta pelanggan dan Anda ingin menemukan semua pelanggan yang kemungkinan besar terkait dengan komputer, jangan coba-coba:
select name from customers where lowercase(name) like '%comp%'
Itu kemungkinan akan menjatuhkan DBA Anda seperti satu ton batu bata.
Salah satu cara kami telah memperbaikinya di masa lalu adalah dengan memasukkan redundansi ke dalam data. Menggunakan contoh pertama itu, kita akan menambahkan kolom tambahan bernama lowerlastname
dan isi dengan nilai huruf kecil lastname
. Kemudian indeks itu untuk tujuan pencarian dan select
pernyataan menjadi sangat cepat, sebagaimana mestinya.
Dan apa pengaruhnya terhadap 3NF kita yang sangat kita cintai, saya dengar Anda bertanya? Jawabannya adalah "tidak banyak", jika Anda tahu apa yang Anda lakukan :-)
Anda dapat mengatur database sehingga kolom baru ini diisi oleh pemicu sisipkan/perbarui, untuk menjaga konsistensi data. Membongkar 3NF karena alasan kinerja dapat diterima, asalkan Anda memahami dan mengurangi konsekuensinya.
Demikian pula, kueri kedua tersebut dapat memiliki pemicu penyisipan/pembaruan yang mengisi kolom baru yang diindeks name_contains_comp
setiap kali entri diperbarui atau disisipkan yang berisi teks yang relevan.
Karena sebagian besar basis data dibaca jauh lebih sering daripada yang ditulis, ini memindahkan biaya penghitungan ke penyisipan/pembaruan, amortisasi efektif di semua operasi tertentu. Pertanyaannya kemudian menjadi:
select name from customers where name_contains_comp = 'Y'
Sekali lagi, Anda akan menemukan kueri yang sangat cepat dengan biaya kecil dari penyisipan dan pembaruan yang sedikit lebih lambat.