Tipe data merupakan permasalahan yang gampang-gampang
susah. Dari sisi daya tampung, tipe data yang terlalu kecil atau sebaliknya
terlalu besar bagi suatu field, dapat
menimbulkan masalah seiring dengan pertambahan data yang pesat setiap harinya.
Menentukan tipe data yang tepat memerlukan ketelitian
dan analisa yang baik. Sebagai contoh, kita perlu mengetahui kapan kita
menggunakan tipe data char atau varchar.
Keduanya menampung karakter, bedanya char menyediakan
ukuran penyimpanan yang tetap (fixed-length),
sedangkan varchar menyediakan ukuran penyimpanan sesuai dengan isi data
(variable-length).
Patokan umum adalah menggunakan tipe data char jika field tersebut
diperuntukkan untuk data dengan panjang yang konsisten. Misalnya kode pos,
bulan yang terdiri dari dua digit (01 sampai 12), dan seterusnya. Varchar
digunakan jika data yang ingin disimpan memiliki panjang yang bervariasi, atau
gunakan varchar(max) jika ukurannya melebihi 8000 byte.
Query
yang Mudah Terbaca
Karena SQL merupakan bahasa declarative, maka tidak
mengherankan jika kita membuat query
berbentuk kalimat nan panjang walaupun mungkin hanya untuk keperluan
menampilkan satu field!
Jangan biarkan query kita susah dibaca
dan dipahami, kecuali kita memang
berniat membuat pusing siapapun yang melihat query Anda. Query panjang yang
ditulis dalam 1
baris jelas akan menyulitkan modifikasi dan
pemahaman, akan jauh lebih baik jika menuliskan query dalam format yang mudah
dicerna.
Pemilihan huruf besar dan kecil juga dapat
mempermudah pembacaan, misalnya dengan konsisten menuliskan keyword SQL dalam
huruf kapital, dan tambahkan komentar bilamana diperlukan.
Hindari Allow Null
Jika memungkinkan, kurangi penggunaan field yang
memperbolehkan nilai null. Sebagai gantinya, kita dapat
memberikan nilai default pada field tersebut.
Nilai null kadang rancu dalam intepretasi programmer dan dapat
mengakibatkan kesalahan logika pemrograman. Selain itu, field null
mengonsumsi byte tambahan sehingga menambah beban pada query yang mengaksesnya.
Hindari
SELECT *
Select mungkin merupakan keyword yang paling sering
digunakan, karena itu optimasi pada perintah SELECT sangat mungkin
dapat memperbaiki kinerja aplikasi secara keseluruhan.
SELECT * digunakan untuk melakukan query semua field yang
terdapat pada sebuah table, tetapi jika hanya ingin
memproses field tertentu, maka sebaiknya kita menuliskan field
yang ingin diakses saja, sehingga query Anda menjadi SELECT field1, field2, field3 dan
seterusnya (jangan pedulikan kode program yang menjadi lebih panjang!). Hal ini
akan mengurangi beban lalu lintas jaringan dan lock pada table, terutama jika
table tersebut memiliki banyak field dan berukuran besar.
Kecepatan
Akses Operator
WHERE 1=1 dan WHERE 0 <> 1 sama-sama merupakan
kondisi yang menghasilkan nilai true. Tetapi, dalam hal ini lebih baik Anda
menggunakan WHERE 1=1 daripada WHERE 0 <> 1. Hal ini dikarenakan operator
= diproses lebih cepat dibandingkan dengan operator <>.
Dari sisi kinerja, urutan operator yang diproses paling
cepat adalah:
1. =
2. >, >=, <. <=
3. LIKE
4. <>
Tidak dalam setiap kondisi operator dapat disubtitusikan
seperti contoh sederhana di atas, tetapi prioritaskanlah penggunaan operator
yang tercepat.
Batasi
Penggunaan Function
Gunakan fungsi-fungsi yang disediakan SQL seperlunya
saja.
Sebagai contoh, jika kita menemukan query
sebagai berikut:
SELECT nama FROM tbl_teman WHERE ucase(nama)
= ‘ABC’
nampak query tersebut ingin mencari record yang memiliki
data berisi “abc”, fungsi ucase digunakan untuk mengubah isi field nama menjadi
huruf besar dan dibandingkan dengan konstanta “ABC” untuk meyakinkan bahwa
semua data “abc” akan tampil, walaupun dituliskan dengan huruf kecil, besar,
ataupun kombinasinya.
Tetapi, cobalah mengganti query tersebut menjadi SELECT
nama FROM tbl_teman WHERE nama = ‘ABC’, perhatikan query ini tidak
menggunakan function ucase. Apakah menghasilkan result yang sama
dengan query pertama? Jika pengaturan database kita tidak
case-sensitive (dan umumnya secara default memang tidak case-sensitive), maka
hasil kedua query tersebut adalah sama. Artinya, dalam kasus ini, sebenarnya tidak
perlu menggunakan function ucase!
Baca
dari Kiri ke Kanan
Query yang Anda tulis akan diproses dari kiri ke kanan,
misalkan terdapat query WHERE kondisi1 AND kondisi2 AND kondisi3, maka kondisi1
akan terlebih dahulu dievaluasi, lalu kemudian kondisi2, kondisi3, dan
seterusnya. Tentunya dengan asumsi tidak ada kondisi yang
diprioritaskan/dikelompokkan dengan menggunakan tanda kurung.
Logika operator AND akan langsung menghasilkan nilai
false saat ditemukan salah satu kondisi false, maka letakkan kondisi yang
paling mungkin memiliki nilai false pada posisi paling kiri. Hal ini
dimaksudkan agar SQL tidak perlu lagi mengevaluasi kondisi berikutnya saat
menemukan salah satu kondisi telah bernilai false.
Jika kita bingung memilih
kondisi mana yang layak menempati posisi terkiri karena kemungkinan falsenya
sama atau tidak bisa diprediksi, pilih kondisi yang lebih sederhana untuk
diproses.
Batasi
ORDER BY
Penggunaan ORDER BY yang berfungsi untuk
mengurutkan data, ternyata memiliki konsekuensi menambah beban query, karena
akan menambah satu proses lagi, yaitu proses sort.
Karena itu gunakan ORDER BY hanya jika benar-benar
dibutuhkan oleh aplikasi.
Atau jika dimungkinkan, kita dapat melakukan
pengurutan pada sisi client dan tidak pada sisi server. Misalnya dengan
menampung data terlebih dahulu pada komponen grid dan melakukan sortir pada
grid tersebut sesuai kebutuhan pengguna.
Lebih baik lakukan proses
Pengurutan / Sorting pada aplikasi, bukan di Query.
Subquery
Atau JOIN
Adakalanya sebuah instruksi dapat dituliskan dalam bentuk
subquery atau perintah JOIN, disarankan memprioritaskan penggunaan JOIN karena
dalam kasus yang umum akan menghasilkan performa yang lebih cepat.
Walaupun demikian, mengolah query merupakan suatu seni,
selalu ada kemungkinan ternyata subquery bekerja lebih cepat dibandingkan JOIN,
misalnya dalam kondisi penggunaan
JOIN yang terlalu banyak, ataupun logika query yang belum optimal.
Gunakan WHERE dalam SELECT
Saat sebuah tabel dengan jumlah
data yang sangat besar diproses, juga terjadi proses lock terhadap tabel tersebut sehingga
menyulitkan pengaksesan tabe
l yang bersangkutan oleh pengguna yang lain.
Bahkan jika kita bermaksud
memanggil seluruh record, tetap menggunakan WHERE merupakan kebiasaan yang
baik.
Jika kita telah menggunakan
WHERE pada awal query, maka kapanpun kita ingin menambahkan
kondisi tertentu, tinggal menyambung query tersebut dengan klausa AND diikuti
kondisi yang diinginkan.
Tapi bagaimana menggunakan WHERE jika benar-benar tidak
ada kondisi apapun? Kita dapat menuliskan
suatu kondisi yang pasti bernilai true, misalnya SELECT …. WHERE 1=1. Bahkan
tools open source phpMyAdmin yang berfungsi untuk menangani database MySQL
selalu menyertakan default klausa WHERE 1 pada perintah SELECT, di mana angka 1
pada MySQL berarti nilai true.
Membatasi
Jumlah Record
Bayangkan Anda menampilkan isi sebuah table dengan
menggunakan SELECT, dan ternyata table tersebut memiliki jutaan record yang
sangat tidak diharapkan untuk tampil seluruhnya.
Skenario yang lebih buruk masih dapat terjadi, yaitu
query tersebut diakses oleh ratusan pengguna lain dalam waktu bersamaan!
Untuk itu, Anda perlu membatasi jumlah record yang
berpotensi mengembalikan record dalam jumlah besar (kecuali memang benar-benar
dibutuhkan), pada SQL Server, Anda dapat menggunakan operator TOP di dalam
perintah SELECT.
Contohnya SELECT TOP 100 nama… akan
menampilkan 100 record teratas field nama.
Jika menggunakan MySQL, Anda dapat menggunakan LIMIT
untuk keperluan yang sama.
Gambar
dalam Database
Database memang tidak hanya diperuntukkan sebagai
penyimpanan teks saja, tetapi dapat juga berupa gambar. Kalau pepatah
mengatakan sebuah gambar bermakna sejuta kata, tidak berarti kita harus
menyediakan tempat penyimpanan seukuran sejuta kata untuk menampung satu
gambar! Akan lebih baik bagi kinerja database jika Anda hanya
menyimpan link atau
lokasi gambar di dalam database, dibandingkan menyimpan fisik gambar
tersebut.
Kecuali jika Anda tidak memiliki pilihan lain, misalnya
karena alasan keamanan atau tidak tersedianya tempat penyimpanan lain untuk
gambar selain di dalam database.
Tetapi, jelas jika kita dapat memisahkan
gambar secara fisik dari database,
maka ukuran dan beban database akan relatif berkurang drastis, proses seperti
back-up dan migrasi akan lebih mudah dilakukan.
Pengukuran
Kinerja
Terdapat tools optimizer yang bervariasi untuk
tiap RDBMS, kita dapat
menggunakannya sebagai panduan untuk meningkatkan kinerja query, di mana kita dapat mengetahui
berapa lama waktu eksekusi atau operasi apa saja yang dilakukan sebuah query.
Jika kita menemukan sebuah
query tampak tidak optimal, berusahalah menulis ulang query tersebut dengan
teknik dan metode yang lebih baik. Semakin banyak query yang dapat dioptimasi,
akan semakin baik kinerja aplikasi kita. Terutama saat
frekuensi pemakaian query tersebut relatif tinggi.
Back-up
Buatlah back-up otomatis secara periodik, sebaiknya tes
dan simulasikan prosedur restore database dan perhitungkan waktu yang
diperlukan untuk membuat sistem pulih kembali jika terjadi sesuatu yang tidak
diharapkan pada database.
Lakukan proses back-up pada waktu di mana aktivitas
relatif rendah agar tidak mengganggu kegiatan operasional.
Jangan ragu mencoba menuliskan ulang query dengan cara
lain jika melihat kemungkinan peningkatan kinerja, contohnya pada potongan
query berikut:
WHERE SUBSTRING(nama,1,1) =’b’
Query di atas akan mengambil record dengan kondisi
karakter pertama kolom nama adalah “b”, sehingga akan tampil isi record seperti
“Budi”, “Badu”, “Benny” dan seterusnya.
Cara lain untuk menghasilkan record yang sama adalah
sebagai berikut:
WHERE nama LIKE ‘b%’
Hasil yang ditampilkan kedua query tersebut akan sama,
tetapi performa yang dihasilkan (terutama untuk record berukuran besar) akan
berbeda. Umumnya kondisi LIKE akan bekerja dengan lebih cepat
dibandingkan function SUBSTRING.
Contoh lain yang lebih kompleks adalah seperti query berikut:
SELECT NIP, nama FROM tbl_pegawai WHERE dept
= ‘IT’ OR kota= ‘jakarta’ OR divisi = ‘programer’
Perhatikan query di atas memiliki tiga kondisi yang
dipisahkan oleh klausa OR. Alternatif lain adalah dengan menuliskan query
sebagai berikut:
SELECT NIP, nama FROM tbl_pegawai WHERE dept
= ‘IT’
UNION
ALL
SELECT
NIP, nama FROM tbl_pegawai WHERE kota = ‘jakarta’
UNION
ALL
SELECT
NIP, nama FROM tbl_pegawai WHERE divisi = ‘programer’
Walaupun penulisan
query menjadi lebih panjang, bisa jadi alternatif ini akan lebih baik. Mengapa?
Dengan asumsi field dept memiliki index, sementara field kota dan divisi tidak
diindex, query pertama tidak akan menggunakan index dan melakukan table scan.
Berbeda dengan query kedua, index akan tetap dilakukan pada sebagian query
sehingga akan menghasilkan kinerja yang relatif lebih baik.
Tidak ada komentar:
Posting Komentar