Optimasi Qury

Optimasi Query

POKOK BAHASAN:

* Optimasi Perintah SQL
* Informasi Jalur Akses Query
* Faktor-faktor yang berpengaruh terhadap kecepatan akses data

PENDAHULUAN

Data yang tersimpan dalam database semakin lama akan semakin besar ukuran atau

volumenya. Kalau tidak didukung dengan kecepatan akses yang memadai maka akan

semakin menurun unjuk kerjanya. Ukuran unjuk kerja dalam hal ini kecepatan akses

data dipengaruhi oleh banyak faktor. Pada bab ini akan membahas tentang optimasi

query serta faktor-faktor lain yang berpengaruh terhadap optimalisasi kecepatan akses

data.

OPTIMASI PADA PERINTAH SQL

Desain aplikasi saja tidak cukup untuk meningkatkan unjuk kerja harus didukung

dengan optimasi dari perintah SQL yang digunakan pada aplikasi tersebut. Dalam

mendesain database, seringkali lokasi fisik data tidak menjadi perhatian penting.

Karena hanya desain logik saja yang diperhatikan. Padahal untuk menampilkan hasil

query dibutuhkan pencarian yang melibatkan struktur fisik penyimpanan data. Inti dari

optimasi query adalah meminimalkan “jalur” pencarian untuk menemukan data yang

disimpan dalam lokasi fisik.

Index pada database digunakan untuk meningkatkan kecepatan akses data. Pada

saat query dijalankan, index mencari data dan menentukan nilai ROWID yang

membantu menemukan lokasi data secara fisik di disk. Akan tetapi penggunaan index

yang tidak tepat, tidak akan meningkatkan unjuk kerja dalam hal ini kecepatan akses

data.

Misal digunakan index yang melibatkan tiga buah kolom yang mengurutkan

kolom menurut kota, propinsi dan kode pos dari tabel karyawan, sebagai berikut :

CREATE INDEX idx_kota_prop_kodepos

ON karyawan(kota, propinsi, kode_pos)

TABLESPACE INDX;

Kemudian user melakukan query sebagai berikut :

SELECT * FROM karyawan WHERE propinsi=’Jawa Barat’;

Pada saat melakukan query ini, index tidak akan digunakan karena kolom pertama

(kota) tidak digunakan dalam klausa WHERE. Jika user sering melakukan query ini,

maka kolom index harus diurutkan menurut propinsi. Selain itu, proses pencarian data

akan lebih cepat jika data terletak pada block tabel yang berdekatan daripada harus

mencari di beberapa datafile yang terletak pada block yang berbeda.

Misal pada perintah SQL berikut ini :

SELECT * FROM karyawan

WHERE id BETWEEN 1010 AND 2010;

Query ini akan melakukan “scan” terhadap sedikit data block jika tabel karyawan

diatas diurutkan berdasarkan kolom id. Untuk mengurutkan berdasarkan kolom yang

berbeda-beda maka tabel disimpan dalam flat file, kemudian tabel diekspor dan

diurutkan sesuai kebutuhan.

Alternatif yang lain, bisa digunakan perintah untuk membuat tabel lain yang

memiliki urutan yang berbeda dari tabel asal, seperti perintah SQL berikut :

CREATE TABLE karyawan_urut

AS SELECT * FROM karyawan

ORDER BY id;

Pada SQL diatas, tabel karyawan_urut berisi data yang sama dengan tabel karyawan

hanya datanya terurut berdasarkan kolom id.

Tips Optimasi Query MySql

Berikut akan saya berikan tips optimasi di MySQL yang sering saya digunakan.

1. Untuk join tabel sebaiknya gunakan inner join daripada left join atau right join.

2. Cek indek-indek di tabel anda terutama untuk field-field yang sering di join. Secara default hal ini sudah dilakukan saat anda membuat primary key dan foreign key. Jadi anda jangan lupa untuk memasang primary dan foreign key di tabel anda..

3. Untuk nilai-nilai unik gunakan AutoIncrement.

4. Gunakan persistent connection(koneksi yang terus menerus). Dalam artian anda dilarang untuk membuka tutup koneksi. Di help Mysql dijelaskan bahwa kalau anda membuka tutup koneksi maka bisa menyebabkan connection overhead.

5. Hindari query yang kompleks untuk tabel yang menggunakan MyISAM dan sering diupdate. Jadi kalau pengin aman gunakan Engine InnoDB saja.

6. Gunakan Explain sintak untuk mengetahui informasi dari pernyataan Select

7. Sebisa mungkin hindari Sub Query.

Berdasar pengalaman saya sering terjadi kasus dimana saya di haruskan sub query yang menggunakan klausa “not in”. Contoh:

Select f.kode_faktur,f.tanggal, from faktur f where f.kode_faktur not in(select kode_faktur from gudang_keluar).

Untuk meningkatkan kecepatan akses datanya, anda dapat menggantinya dengan sintak berikut :

Select f.kode_faktur,f.tanggal from faktur f left join gudang_keluar g on f.kode_faktur=g.kode_faktur where g.kode_faktur is null

Di samping mempengaruhi kecepatan, berdasar pengalaman saya juga, klausa not in untuk jumlah data yang besar kadang hasil yang di dapat tidak sesuai dengan yang saya harapkan.

Tips-tips di atas adalah berdasar pengalaman saya. Kalau anda pengin lihat lebih detail lagi lihat saja di helpnya mysql, lebih komplet lagi plus menambah pusing kepala.

Tips Optimasi dan Mengontrol MySQL

Buat anda yang baru saja mengenal database server jenis MySQL dan melakukan programming dengan sedikit data ataupun mempunyai pangakses sedikit tidak terlalu bermasalah dengan load server yang makin hari semakin berat. Saya pernah mengalami server hang karena kesalahan query yang melakukan join dua tabel yang masing-masing mempunyai record lebih dari 100 ribu record berisi postingan blog berbentuk text. Kejadian itu hingga menyebabkan server hang walaupun kondisi server masih terbilang bagus. Waktu itu saya menggunakan server bersistem operasi Solaris dengan memori 4 GB. Tapi tetap saja locked.

Saya coba evaluasi beberapa query dengan menginstall mtop terlebih dahulu, mungkin buat anda pengguna hosting akan kesulitan untuk menggunakan mtop, tapi coba saja yang versi webnya. dengan mtop saya bisa melakukan control untuk query yang membutuhkan resources yang sangat besar. bahkan saya bisa melihat query mana yang harus diperbaiki.

Setelah dievaluasi maka munculah beberapa tips yang bisa digunakan antara lain:

1. Lakukan konfigurasi maksimal pada my.cf, tentu cara ini hanya bisa dilakukan oleh anda yang mempunyai server sendiri.

2. Sebisa mungkin hindari join table, apalagi yang datanya sama-sama besar. Untuk join tabel sebaiknya gunakan inner join daripada left join atau right join.

3. Check indek-indek di tabel anda terutama untuk field-field yang sering di join. Secara default hal ini sudah dilakukan saat anda membuat primary key dan foreign key. Jadi anda jangan lupa untuk memasang primary dan foreign key di tabel anda.

4. Gunakan koneksi yang terus menerus, dengan kata lain jangan melakukan buka dan tutup konek kedalam mysql. hal ini justru akan semakin berat

5. Hindari penggunakan asterik atau bintang seperti select * from tbl_contoh, cara ini memang mudah dilakukan tapi jangan salah dengan melakukannya akan membuat database anda pusing untuk menampilkan data, jadi gunakan field yang memang benar-benar dibutuhkan misalkan select id,nama from tbl_contoh.

6. Lakukan clear memory dengan menambahkan script mysql_free_result($query) setelah melakukan query, cara ini cukup ampuh untuk mengurangi load server dan memori.

7. Pisahkan tabel yang sering sekali dilakukan update, misalkan saya mempunyai tabel member yang beranggotakan 100 ribu orang, untuk membuat statistik untuk member maka kita seharusnya membuat tabel statistik member yang lebih sederhana dan updating data lastlogin atau berapa kali login dilakukan di tabel statistik

8. Lakukan backup secara berkala, saya termasuk orang yang ceroboh untuk masalah ini dan beberapa kali melakukan hal yang sama, jujur dari tahun 2003 saya sudah 2 kali menangis akibat kehilangan ribuan data mysql yang sangat penting. Saat ini saya gunakan mirroring dan replikasi mysql ke server lain supaya lebih aman.

Inti dari semuanya adalah saya mengajak anda semua jangan malas untuk menghindari * pada query atau menyisipkan msql_free_result di akhir query. karena semuanya sangat berpengaruh.

PERENCANAAN EKSEKUSI

Bagaimana cara melihat jalur akses yang akan digunakan database saat

melakukan query ? Pada Database Oracle, informasi ini dapat dilihat dengan

menggunakan perintah explain plan, yang akan memberi informasi tentang rencana

eksekusi dari suatu query. Informasi ini disimpan dalam tabel PLAN_TABLE yang

terdapat di schema user yang mengeksekusi perintah tersebut.

Sebelum melakukan perintah explain plan, terlebih dahulu buat table

PLAN_TABLE dengan menggunakan script utlxplan.sql yang diambil dari

\%ORACLE_HOME%\RDBMS\ADMIN.

Setelah itu table PLAN_TABLE dapat digunakan seperti contoh berikut :

SQL> explain plan

Set statement_id=’test1’

Into plan_table for

Select * from karyawan where gaji=2000000;

Dalam PLAN_TABLE rencana eksekusi diatas dikenal dengan nama test1 yang

terdefinisi pada kolom statement_id.

Untuk melihat rencana eksekusi dari test1, digunakan perintah SELECT berikut :

SELECT LPAD(’ ’,2*Level)||Operation||’ ’||Options||’ ’||Object_Name Q_Plan

FROM plan_table

WHERE statement_id=’test1’

CONNECT BY PRIOR AND statement_id=’test1’

START WITH AND statement_id=’test1’;

Contoh hasil dari eksekusi query tersebut :

Q_PLAN

——————————————————————–

SELECT STATEMENT

TABLE ACCESS FULL KARYAWAN

Output tersebut dibaca mulai dari yang indent-nya paling dalam yaitu : TABLE

ACCESS FULL KARYAWAN. Dikarenakan klausa WHERE melibatkan kolom gaji

namun kolom gaji tidak ada index-nya, maka Oracle melakukan full table scan. Setelah

seluruh tabel karyawan selesai dibaca, selanjutnya adalah SELECT STATEMENT yang

berfungsi untuk menampilkan hasil query.

FAKTOR LAIN YANG BERPENGARUH TERHADAP KECEPATAN

AKSES DATA

Faktor lain yang berpengaruh terhadap kecepatan akses data, tidak hanya terletak

pada optimasi perintah SQL, tapi terhadap hal-hal lain yang berpengaruh. Diantaranya

adalah optimasi aplikasi dan penggunaan cluster dan index. Hal yang akan dibahas

dalam optimasi query berikut ini tidak melibatkan penggunaan komponen yang ada

dalam Arsitektur database engine, misal pada database Oracle kecepatan akses data

dipengaruhi oleh penyesuaian pada shared pool, buffer cache, redo log buffer dan sistem

operasi yang digunakan.

OPTIMASI APLIKASI

Dalam pembuatan aplikasi, yang perlu mendapat perhatian adalah apakah akses

terhadap data sudah efisien. Efisien dalam hal penggunaan obyek yang mendukung

kecepatan akses, seperti index atau cluster. Kemudian juga bagaimana cara database didesain.

Apakah desain database sudah melakukan normalisasi data secara tepat.

Kadangkala normalisasi sampai level yang kesekian, tidak menjamin suatu

desain yang efisien. Untuk membuat desain yang lebih tepat, kadang setelah melakukan

normalisasi perlu dilakukan denormalisasi. Misalnya tabel yang hubungannya one-toone

dan sering diakses bersama lebih baik disatukan dalam satu tabel.

CLUSTER DAN INDEX

Cluster adalah suatu segment yang menyimpan data dari tabel yang berbeda

dalam suatu struktur fisik disk yang berdekatan. Konfigurasi ini bermanfaat untuk

akses data dari beberapa tabel yang sering di-query. Penggunaan cluster secara tepat

dilaksanakan setelah menganalisa tabel-tabel mana saja yang sering di-query secara

bersamaan menggunaan perintah SQL join.

Jika aplikasi sering melakukan query dengan menggunakan suatu kolom yang

berada pada klausa WHERE, maka harus digunakan index yang melibatkan kolom

tersebut. Penggunaan index yang tepat bergantung pada jenis nilai yang terdapat dalam

kolom yang akan diindex. Dalam RDBMS Oracle, index B-Tree digunakan untuk

kolom yang mengandung nilai yang cukup bervariasi, sedangkan untuk nilai yang tidak

memiliki variasi cukup banyak, lebih baik menggunakan index bitmap.

RINGKASAN:

•Data yang tersimpan dalam jumlah yang sangat besar, Terdapat aturan system

informasi dalam organisasi, system basis data dilihat sebagai bagian system

informasi dalam aplikasi berskala besar.

•Untuk meningkatkan unjuk kerja tidak hanya desain logik saja yang diperhatikan

tapi juga struktur fisik penyimpanan data.

•Penggunaan Index pada database secara tepat, dapat digunakan untuk

meningkatkan kecepatan akses data.

•Informasi tentang jalur akses yang digunakan oleh database untuk melaksanakan

query dalam database Oracle dapat dengan menggunakan perintah explain plan.

•Selain optimasi perintah SQL, faktor lain yang berpengaruh terhadap kecepatan

akses data adalah optimasi aplikasi dan penggunaan cluster dan index.

•Pada sebuah database engine semisal pada database Oracle kecepatan akses data

dipengaruhi oleh beberapa komponen arsitektur pembentuknya seperti shared

pool, buffer cache, dan redo log buffer.

•Optimasi aplikasi tergantung pada efisiensi penggunaan obyek yang mendukung

kecepatan akses seperti index atau cluster, dan normalisasi data pada desain

database.

0 comments:

Posting Komentar