18 Teknik Optimalisasi kinerja Query SQL

SQL (Structured Query Language) adalah bahasa komputer basis data yang dirancang untuk mengelola data dalam Sistem Manajemen Basis Data Relasional (RDBMS: Relational Database Management System). SQL menyederhanakan perolehan data, SQL mengurangi kepadatan lalu-lintas jaringan, pada sistem basis data yang berbasis jaringan penggunaan SQL dapat mengurangi beban traffic jaringan.

Pernyataan diatas adalah sebuah teori yang mendefinisikan SQL dan kemampuannya, namun pada kenyataannya jika data yang sudah sangat besar permasalahan performance sering kali muncul dan mengganggu kinerja. Berikut ini beberapa teknik yang dapat digunakan untuk memecahkannya.

1. Pemodelan Database

Mendesain basisdata adalah langkah pertama dan penting dalam urutan proses membangun dan mengolah sebuah basisdata. Desain database mencakup desain tabel (entitas/entity) dan desain relasi antar entitas (entity relationship/ER). Karena sebuah basisdata jika didesain dengan cara yang benar dan baik akan membuat hasil dan proses pengolahan data menjadi benar dan baik pula.

2. Index

Mengindeks kolom dalam tabel adalah cara yang biasa dilakukan untuk mengoptimalkan hasil pencarian query SQL.  Membuat indeks dalam sql tak ubahnya seperti membuat daftar indeks pada buku. Bayangkan ketika anda ingin mencari sebuah section pada buku mengenai suatu hal dan harus mencari setiap halaman dari awal sampai akhir, dengan indeks anda cukup mencari urutan indeks kata tersebut dan langsung membuka halaman rujukan yang ada pada indeks. Penggunaan indeks pada eksekusi query SQL akan benar-benar terasa ketika tabel dan basis data yang kita punya sudah cukup besar.

3. Symbol Operator

Penggunaan operator simbol seperti <, >, =, !=, ><, dll sangat membantu dalam menghasilkan kecepatan pencarian dari query.  Cara kerja database management system (DBMS) dalam menerapkan query dengan kondisi ">" dibandingkan dengan "=>" akan sedikit berbeda, apabila kita menggunakan "=>" maka DBMS akan menerapkan dua kriteria pada setiap hasil, tidak langsung mencari pada kondisi langsung seperti apabila kita menggunakan ">".

4. Wildcard (kartu liar)

Wildcard yang digambarkan dengan simbol "%" yang kita tuliskan pada kondisi/kriteria query akan sangat berpengaruh pada lamanya proses pencarian. Wildcard sendiri dapat kita bagi menjadi tiga bagian penggunaan, yaitu wildcard penuh (contoh '%kata%'), postfix wildcard (contoh 'kata%'), dan prefix wildcard (contoh '%kata'). Sebisa mungkin hindari penggunaan wildcard penuh karena untuk ukuran tabel dengan baris yang banyak, dan pencarian kolum dengan panjang kolom yang besar akan benar-benar menyiksa basis data dalam melakukan pencarian.

5. Operator Negatif

Penggunaan operator negatif (seperti NOT, NOT LIKE, NOT IN, NOT EXIST, != dll) akan lebih memakan waktu lama dibandingkan operator positif. Operator = merupakan operator paling memudahkan database dalam melakukan pencarian, terutama ketika database sudah terindeks maka pencarian exact match ini akan dihasilkan dengan cepat.

6. COUNT vs EXIST

Seringkali dalam pembuatan sebuah loop dan logika dalam aplikasi- kita ingin membuat penguji sederhana dengan pembuatan perintah yang dilaksanakan hanya jika sebuah nilai ada dalam tabel (pada kolom tertentu dalam tabel) - kita menggunakan COUNT sebagai kriteria. Dalam artian ketika COUNT menghasilkan angka > 0 maka loop atau logika akan dijalankan.

SELECT KOLOM FROM TABEL WHERE COUNT > 0 

Penggunaan COUNT akan melakukan pencarian dari awal hingga akhir baris dari tabel. Sebagai alternatif yang lebih baik anda dapat menggunakan EXIST, kriteria ini akan menghentikan pencarian ketika kriteria/kondisi sudah ditemukan.

7. Wildcard vs Substr

Penggunaan substr() dalam query akan membuat DBMS berusaha memotong seluruh kolom dalam sebuah tabel sesuai kondisi substr(). Sebagai alternatif yang lebih baik dapat digunakan postfix wildcard untuk membuat pencarian menjadi lebih cepat.

8. Index Unique Column

Hal ini masih berhubungan dengan indexing pada bahasan pertama. Index bertipe unik (unique) dalam beberapa DBMS akan memberikan kecepatan pencarian tersendiri, terutama index yang paling sering dilakukan pencarian.

9. Operator Max dan Min

Max dan Min adalah operator yang sebisa mungkin tidak terlalu sering digunakan karena pencarian yang digunakan dilakukan secara menyeluruh dari awal sampai akhir tabel. Penggunaan index akan sangat membantu jika nilai maksimum/minimum yang dijadikan sebagai kriteria adalah indeks. Tapi pada umumnya tipe kolom yang dijadikan kriteria adalah int, dec, dan date/time.

10. Tipe Data

Gunakan tipe data yang paling kecil yang dapat digunakan dengan turut memperhatikan kebutuhan dimasa yang akan datang. Penggunaan tinyint dan int akan memberikan hasil yang berbeda, begitu juga dengan hasil pencarian.

11. Primary Index

Primary Column yang digunakan untuk indeks harus dibuat sependek mungkin, dengan begitu identifikasi dari baris-baris yang ada akan lebih efisien bagi DBMS.

12. String Indexing

Pengindeks-an seluruh string sebenarnya tidak perlu dilakukan karena akan lebih baik jika kita menggunakan prefix atau postfix dari string akan menghasilkan daftar isi yang lebih ringkas dan efisien. Ingat, semakin pendek indeks maka pencarian akan menjadi lebih cepat dan lebih hemat sumber daya.

13. Batasi Hasil Query

Hasil query yang menampilkan seluruh tabel memang tidak terlalu masalah jika memang kita membutuhkan hasil penuh. Namun ketika berbicara aplikasi yang akan dilihat oleh pengguna (bukan pengolahan data lebih lanjut) maka membatasi hasil query akan lebih baik. Pagination dengan menggunakan LIMIT sebesar 10, 30, atau 50 dirasa sudah cukup untuk menampilkan aplikasi yang akan dibaca oleh pengguna.

14. Gunakan Nilai Otomatis (Default Value)

Penggunaan nilai otomatis pada beberapa DBMS yang menyediakan fitur ini sangat bermanfaat terutama dalam hal melakukan insertpada basis data. Nilai otomatis akan mempercepat kerja DBMS dalam Insert data ketika tidak ada nilai yang dikirim dari query yang dieksekusi.

15. IN Subquery

Penggunaan IN umum digunakan ketika kriteria yang kita gunakan berupa array. Penggunaan subquery sering digunakan dalam membentuk kriteria dinamis yang akan digunakan dalam kriteria IN. Namun hal ini akan lebih berat karena DBMS akan menggunakan kriteria induk terlebih dahulu, baru kemudian menggunakan kriteria subquery. Dalam hal ini DBMS bekerja 3 tahap, dimana dengan kriteria IN yang konstan hanya akan menjalankan 1 tahap pencarian saja.

Sebagai alternatif anda dapat membuat array dengan mendeclare terlebih dahulu subquery ke dalam sebuah variabel, dengan begitu variabel ini dapat digunakan berkali-kali dalam query yang lain. Akan lebih baik jika kita melibatkan sumber daya yang dimiliki pengguna dengan membuat session.

16. UNION more than OR

Penggunaan OR sebagai kriteria berganda adalah jamak dilakukan. Namun ada alternatif lain yang dapat dibuat yaitu dengan menggunakan UNION apabila kolom yang ingin kita cari adalah sama. Namun tentunya penggunaan UNION ini memiliki keterbatasan. Perbedaan kecepatan untuk kriteria OR, UNION, dan IN sebenarnya dapat diperdebatkan mengingat ketiga kondisi kriteria di atas memerlukan strategi algoritma koding yang berbeda dari tiap programmer.

17. View

Dengan membuat view untuk menyediakan data-data komplek tertentu, maka proses eksekusi terhadap query dapat dikurangi.  

18. Store Procedure

Untuk proses transaksi pengolahan data store procedure dapat membantu mengurangi beban jaringan. Karena store procedure dapat berjalan dibelakang aplikasi.