Wednesday, August 18, 2010

Query Optimization

Penggunaan Query dalam aplikasi yang memanfaatkan database merupakan suatu hal yang tak terelekkan. Meskipun saat ini banyak digunakan berbagai teknologi yang melakukan wrapping terhadap query secara langsung dan lebih menekankan paradigma Object dalam akses database, Namun seringkali penggunaan native query masih tetap dibutuhkan. Beberapa hal yang sering kita lupakan adalah penggunaan query yang asal jadi, sehingga seringkali performansi menjadi drop karena kurang bijak dalam menyusun query secara langsung.

Dari beberapa pengalaman, hal-hal yang sering kurang diperhatikan atau terlupa dalam penggunaan query sebagai berikut :

1. Klausa where belum memanfaatkan kolom yang memiliki index.

akan lebih optimal apabila kolom yang sering digunakan dalam kriteria pencarian merupakan kolom yang menjadi index dalam tabel yang bersangkutan.

2. Klausa where tidak disusun berdasarkan urutan filter yang menghasilkan data lebih sedikit

Apabila dalam kriteria pencarian, terdapat beberapa kondisi yang harus dipenuhi, maka usahakan melakukan ordering urutan kondisi yang diperkirakan menghasilkan data yang lebih kecil.
Misalkan :
select NIM, name from A where name like '%yulius%' and substr(NIM,1,3)='135'
akan lebih optimal bila diubah menjadi
select NIM, name from A where substr(NIM,1,3)='135' and name like '%yulius%'

3. Penggunaan Like

Jika melakukan pencarian yang melibatkan string, maka minimalisir penggunaan “Like”. Penggunaan fungsi / operator String seperti Substring akan lebih baik jika memungkinkan.

4. Select All (*)

Usahakan hanya melakukan select terhadap kolom yang diperlukan saja.

5. Cross Join

Usahakan digunakan Inner Join atau Outer Join daripada Penggunaan Cross Join
Contoh :
select A.id, B.name from A, B where A.id=B.a_id
akan lebih baik jika digunakan
select A.id, B.name from A inner join B on A.id=B.a_id

Pemanfaatan Join juga akan lebih optimal apabila kita hanya melakukan join terhadap table yang sudah diselect terlebih dahulu sesuai dengan kebutuhan (kolom maupun kriterianya)
contoh optimasi dari code diatas sebagai berikut :
select A.id, B.name from
(select id from A) A
inner join
(select name,a_id from B) B on A.id=B.a_id

6. Banyak memanfaatkan Sub Query

Pemanfaatan sub query bisa dialihkan menjadi penggunaan inner join. Contoh :
select A.id, (select B.name from B where B.id=A.b_id) from A
akan menjadi lebih baik bila diubah menjadi :
select A.id, B.name from A inner join
(select B.name from B) as B on B.a_id =A.id

7. Menggunakan mekanisme “in” list dalam klausa where

apabila kita melakukan filtering terhadap suatu kolom yang match terhadap suatu value yang didapat dari table lain, maka pemanfaatan fungsi exists akan lebih baik dibanding in
contoh:
select A.name from A where id in (select a_id from B where B.active=true)
bisa menjadi lebih baik apabila diubah menjadi
select A.name from A where exists (select a_id from B where A.id=B.a_id and B.active=true)

Demikian Beberapa hal yang sering digunakan dalam pemanfaatan suatu query dimana sedikit perubahan dalam query yang digunakan akan bisa memberikan performansi yang jauh lebih baik. Beberapa database biasa memberikan fungsi built in yang juga seharusnya bisa digunakan secara lebih optimal untuk mendukung pemanfaatan nativ query.

No comments:

Post a Comment