Copyright © Data Nyamana
Design by Dzignine
Thursday 20 December 2012

Query Lanjutan dan Optimasi Query

Kemarin kita sudah belajar mengenai query dalam basis data. Kadang-kadang dalam mengelola basis data kita dihadapkan pada sebuah proses pengambilan data yang tidak mungkin dilakukan hanya dengan menggunakan satu query saja. Terpaksa kita harus menggunakan lebih dari satu query. Praktek ini tentu saja tidak efisien, karena akan ada banyak query yang dieksekusi. Sebaiknya dalam menghadapi masalah semacam ini kita menggunakan Subquery.

Subquery

Subquery merupakan query yang ada di dalam suatu query. Atau agar lebih jelas dapat dilihat query berikut:

select nama from pegawai where sal = (select max(gaji) from pegawai);

Dalam query tersebut terlihat bahwa ada sebuah query di dalam sebuah query. Inilah yang disebut dengan subquery. Query di atas adalah query untuk menampilkan nama pegawai dengan gaji paling besar.

Ada beberapa operator dalam operasi subquery, yaitu operator Exist, Any, dan All. Ketiga operator tersebut dapat digunakan untuk tiga operasi yang berbeda. Penjelasannya adalah sebagai berikut:

Operator Exist

Merupakan jenis operator boolean, yang mengahasilkan nilai benar (true) atau salah (false). Operator exists akan memberikan nilai benar (true) kalau sub query menghasilkan paling tidak sebuah baris / record.

Contoh :
Akan ditampilkan daftar nama pegawai yang sudah mempunyai departemen.

select nama from pegawai where exists (select*from departemen where id_departemen = pegawai.id_departemen);

Keterangan: Perintah pada sub query diatas berisi pengecekan id_departemen pada tabel pegawai.

Contoh 2:
Akan ditampilkan daftar nama pegawai yang tidak mempunyai departemen :

select nama from pegawai where not exists (select*from departemen where id_departemen = pegawai.id_departemen);

Keterangan: Perintah pada sub query diatas sama dengan contoh 1, hanya ditambahkan dengan not sebelum exists untuk pengecekan id_departemen di tabel pegawai.


Operator Any
Operator Any hampir sama penggunaannya seperti Exists. Tetapi operator relasi yang digunakan biasanya selain = (sama dengan). hal tersebut disebabkan apabila operator relasi = yang digunakan, maka sebetulnya fungsi operator Any (some) sama seperti operator IN, sehingga kondisi seperti itu tidak dianjurkan karena lebih mudah pemahamannya apabila menggunakan operator IN.

Contoh :
Akan menampilkan daftar nama pegawai dan gaji yang gajinya tidak paling sedikit :

select nama, gaji from pegawai where gaji > any (select gaji from pegawai);

Operator All
Operator all digunakan untuk melakukan pembandingan dengan sub query. Kondisi dengan all menghasilkan nilai benar jika pembandingan menghasilkan benar untuk setiap nilai dalam sub query.

Contoh :
Akan menampilkan nama dan gaji pegawai yang gajinya lebih rendah daripada semua pegawai yang pekerjaannya 'SALESMAN' :

select nama, gaji from pegawai where gaji > any (select gaji from pegawai);

Optimasi Query

Optimasi query dapat kita gunakan untuk mempercepat eksekusi query dalam database. Jika data kita hanya sedikit, maka optimasi query tidak perlu dilakukan, karena eksekusi query tidak akan memakan waktu lama.  Tetapi jika data kita sudah mencapai ratusan atau  bahkan ribuan, maka akan terasa sekali eksekusi querinya  memakan waktu yang cukup lama. Untuk mengatasi hal ini maka query kita harus dioptimasi.

Salah satu cara optimasi query yaitu dengan membuat indeks pada database. 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.

0 comments:

Post a Comment