Optimasi Query D Sinaga M Kom Pengertian Optimasi

  • Slides: 50
Download presentation
Optimasi Query D. Sinaga, M. Kom

Optimasi Query D. Sinaga, M. Kom

Pengertian Optimasi Query • Optimasi Query adalah suatu proses untuk menganalisa query untuk menentukan

Pengertian Optimasi Query • Optimasi Query adalah suatu proses untuk menganalisa query untuk menentukan sumber-sumber apa saja yang digunakan oleh query tersebut dan apakah penggunaan dari sumber tersebut dapat dikurangi tanpa merubah output. • Atau bisa juga dikatakan bahwa optimisasi query adalah sebuah prosedur untuk meningkatkan strategi evaluasi dari suatu query untuk membuat evaluasi tersebut menjadi lebih efektif. • Optimisasi query mencakup beberapa teknik seperti transformasi query ke dalam bentuk logika yang sama, memilih jalan akses yang optimal dan mengoptimumkan penyimpanan data.

Optimasi Perintah Structured Query Language (SQL) • Desain aplikasi saja tidak cukup untuk meningkatkan

Optimasi Perintah Structured Query Language (SQL) • Desain aplikasi saja tidak cukup untuk meningkatkan kinerja sebuah aplikasi yang menggunakan database. • Optimasi melalui perintah SQL juga memegang peranan yang tidak kalah penting. • Inti dari SQL itu sendiri adalah perintah untuk melakukan pengambilan (retrieval), penambahan (insertion), modifikasi (updating), dan penghapusan (deletion) data, disertai dengan fungsi pendukung administrasi dan managemen database.

Optimasi dengan Index • Index dapat meningkatkan kecepatan pencarian pada record yang diinginkan. Tetapi,

Optimasi dengan Index • Index dapat meningkatkan kecepatan pencarian pada record yang diinginkan. Tetapi, dalam memilih field yang perlu di-index harus selektif, karena tidak semua field memerlukannya. • Pada field yang di-index, pencarian dilakukan secara index scan, atau membaca pada index, tidak langsung pada table yang bersangkutan. • Sementara pencarian yang dilakukan langsung dengan membaca record demi record pada table disebut dengan table scan. • Table scan bisa jadi bekerja lebih cepat saat mengakses record dalam jumlah relatif kecil, ataupun pada saat aplikasi memang memerlukan pembacaan table secara keseluruhan. • Sementara dalam mengakses record yang besar pada field tertentu, index scan dapat mengurangi operasi pembacaan I/O sehingga tidak jarang menghasilkan kinerja yang lebih cepat.

Menentukan Tipe Data • Tipe data merupakan permasalahan yang gampang-gampang susah. Dari sisi daya

Menentukan Tipe Data • 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, 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 (variablelength).

. Jangan Izinkan Allow Null • Kurangi penggunaan field yang memperbolehkan nilai null. •

. Jangan Izinkan Allow Null • Kurangi penggunaan field yang memperbolehkan nilai null. • Sebagai gantinya, dapat diberikan nilai default pada field tersebut. • Nilai null kadang rancu dalam intepretasi programer dan dapat mengakibatkan kesalahan logika pemrograman. • Selain itu, field null mengonsumsi byte tambahan sehingga menambah beban pada query yang mengaksesnya.

Query yang Mudah Terbaca • Karena SQL merupakan bahasa declarative, maka tidak mengherankan jika

Query yang Mudah Terbaca • Karena SQL merupakan bahasa declarative, maka tidak mengherankan jika penulisan query berbentuk kalimat panjang walaupun mungkin hanya untuk keperluan menampilkan satu field. • Query panjang yang ditulis dalam 1 baris jelas akan menyulitkan modifikasi dan pemahaman, akan jauh lebih baik jika penulisan 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 SELECT * • SELECT mungkin merupakan keyword yang paling sering digunakan, karena itu

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 ditulis field yang ingin diakses saja, sehingga query menjadi SELECT field 1, field 2, field 3 dan seterusnya. • Hal ini akan mengurangi beban lalu lintas jaringan dan lock pada table, terutama jika table tersebut memiliki banyak field dan berukuran besar.

Batasi ORDER BY • Penggunaan ORDER BY yang berfungsi untuk mengurutkan data, ternyata memiliki

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, dapat dilakukan 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.

Subquery atau JOIN • Adakalanya sebuah instruksi dapat dituliskan dalam bentuk subquery atau perintah

Subquery atau JOIN • Adakalanya sebuah instruksi dapat dituliskan dalam bentuk subquery atau perintah JOIN, disarankan prioritaskan 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 • Di mana ada gula di sana ada semut”. Untuk

Gunakan WHERE dalam SELECT • Di mana ada gula di sana ada semut”. Untuk programer database, pepatah itu perlu dimodifikasi menjadi “di mana ada SELECT di sana ada WHERE”, untuk mengingatkan pentingnya klausa WHERE sebagai kondisi untuk menyaring record sehingga meminimalkan beban jaringan. • Saat sebuah table dengan jumlah data yang sangat besar diproses, juga terjadi proses lock terhadap table tersebut sehingga menyulitkan pengaksesan table yang bersangkutan oleh pengguna yang lain.

 • Bahkan jika bermaksud memanggil seluruh record, tetap menggunakan WHERE merupakan kebiasaan yang

• Bahkan jika bermaksud memanggil seluruh record, tetap menggunakan WHERE merupakan kebiasaan yang baik. Jika telah menggunakan WHERE pada awal query, maka kapanpun ingin menambahkan kondisi tertentu, tinggal menyambung query tersebut dengan klausa AND dan diikuti kondisi yang diinginkan. • Jika benar-benar tidak ada kondisi apapun, dapat ditulis suatu kondisi yang pasti bernilai true, misalnya SELECT. . WHERE 1=1.

Membatasi Jumlah Record • Bayangkan jika ingin menampilkan isi sebuah table dengan menggunakan SELECT,

Membatasi Jumlah Record • Bayangkan jika ingin 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, perlu dibatasi jumlah record yang berpotensi mengembalikan record dalam jumlah besar (kecuali memang benar-benar dibutuhkan), pada SQL Server, dapat menggunakan operator TOP di dalam perintah SELECT. • Contohnya SELECT TOP 100 nama. . . akan menampilkan 100 record teratas field nama. • Jika menggunakan My. SQL, dapat menggunakan LIMIT untuk keperluan yang sama.

Kecepatan Akses Operator • WHERE 1=1 dan WHERE 0 <> 1 sama-sama merupakan kondisi

Kecepatan Akses Operator • WHERE 1=1 dan WHERE 0 <> 1 sama-sama merupakan kondisi yang menghasilkan nilai true. Tetapi, dalam hal ini lebih baik 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,

Batasi Penggunaan Function • Gunakan fungsi-fungsi yang disediakan SQL seperlunya saja. • Sebagai contoh, jika 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 tidak

• Apakah menghasilkan result yang sama dengan query pertama? Jika pengaturan database 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 ditulis akan diproses dari kiri ke

Baca dari Kiri ke Kanan • Query yang ditulis akan diproses dari kiri ke kanan, misalkan terdapat query WHERE kondisi 1 AND kondisi 2 AND kondisi 3, maka kondisi 1 akan terlebih dahulu dievaluasi, lalu kemudian kondisi 2, kondisi 3, 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 bingung memilih kondisi mana yang layak menempati posisi terkiri karena kemungkinan falsenya sama atau tidak bisa diprediksi, pilih kondisi yang lebih sederhana untuk diproses.

Gambar dalam Database • Database memang tidak hanya diperuntukkan sebagai penyimpanan teks saja, tetapi

Gambar dalam Database • Database memang tidak hanya diperuntukkan sebagai penyimpanan teks saja, tetapi dapat juga berupa gambar. • Gambar simpan link atau lokasi gambar di dalam database, dibandingkan menyimpan fisik gambar tersebut. Kecuali jika tidak memiliki pilihan lain, misalnya karena alasan keamanan atau tidak tersedianya tempat penyimpanan lain untuk gambar selain di dalam database. • Tetapi, jika 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, yang dapat digunakan

Pengukuran Kinerja • Terdapat tools optimizer yang bervariasi untuk tiap RDBMS, yang dapat digunakan sebagai panduan untuk meningkatkan kinerja query, di mana dapat diketahui berapa lama waktu eksekusi atau operasi apa saja yang dilakukan sebuah query. • Jika 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. Terutama saat frekuensi pemakaian query tersebut relatif tinggi.

Back-up data • Buatlah back-up otomatis secara periodik, sebaiknya tes dan simulasikan prosedur restore

Back-up data • 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.

Contoh : • Hindari mismatch tipe data untuk pengindeksan kolom Sebelum Optimasi Setelah Optimasi

Contoh : • Hindari mismatch tipe data untuk pengindeksan kolom Sebelum Optimasi Setelah Optimasi select name, age, city, state from employee where employee_id=’ 1000′; select name, age, city, state from employee where employee_id=1000; Waktu yang dibutuhkan : 2. 3 sec Waktu yang dibutuhkan : 0. 3 sec

Menentukan kondisi pada WHERE bukan pada HAVING Sebelum Optimasi Setelah Optimasi select name, count(1)

Menentukan kondisi pada WHERE bukan pada HAVING Sebelum Optimasi Setelah Optimasi select name, count(1) from employee group by name having name=’karthi’; select name, count(1) from employee where name=’karthi’ group by name; Waktu yang dibutuhkan = 2. 2 sec Waktu yang dibutuhkan = 0. 3 sec

Hindari fungsi pada kolom yang diindeks Sebelum Optimasi Setelah Optimasi select name, age, city

Hindari fungsi pada kolom yang diindeks Sebelum Optimasi Setelah Optimasi select name, age, city from employee where substr(employee_name, 1, 3)=’kar’; select name, age, city from employee where employee_name like ‘kar%’; Waktu yang dibutuhkan : 2. 8 sec Waktu yang dibutuhkan : 0. 3 sec

Penggunaan join untuk mengganti inner query Sebelum Optimasi Setelah Optimasi select employee_name from employee

Penggunaan join untuk mengganti inner query Sebelum Optimasi Setelah Optimasi select employee_name from employee where employee_id in ( select employee_id from defaulters) select employee_name from employee e, defaulters d where e. employee_id=d. employee_id Waktu yang dibutuhkan : 14. 1 sec Waktu yang dibutuhkan : 5. 5 sec

Pengertian Optimasi Query • Optimasi Query adalah suatu proses untuk menganalisa query untuk menentukan

Pengertian Optimasi Query • Optimasi Query adalah suatu proses untuk menganalisa query untuk menentukan sumber-sumber apa saja yang digunakan oleh query tersebut dan apakah penggunaan dari sumber tersebut dapat dikurangi tanpa merubah output. • Atau bisa juga dikatakan bahwa optimisasi query adalah sebuah prosedur untuk meningkatkan strategi evaluasi dari suatu query untuk membuat evaluasi tersebut menjadi lebih efektif. • Optimisasi query mencakup beberapa teknik seperti transformasi query ke dalam bentuk logika yang sama, memilih jalan akses yang optimal dan mengoptimumkan penyimpanan data.

 • SQL Tuning or SQL Optimization • Sql Statements are used to retrieve

• SQL Tuning or SQL Optimization • Sql Statements are used to retrieve data from the database. We can get same results by writing different sql queries. But use of the best query is important when performance is considered. So you need to sql query tuning based on the requirement. Here is the list of queries which we use reqularly and how these sql queries can be optimized for better performance.

1. * (Asterisk) • The sql query becomes faster if you use the actual

1. * (Asterisk) • The sql query becomes faster if you use the actual columns names in SELECT statement instead of than '*'. • For Example: Write the query as • SELECT id, first_name, last_name, age, subject FROM student_details; • Instead of : • SELECT * FROM student_details;

2. HAVING • HAVING clause is used to filter the rows after all the

2. HAVING • HAVING clause is used to filter the rows after all the rows are selected. It is just like a filter. Do not use HAVING clause for any other purposes. For Example: Write the query as : Instead of : • SELECT subject, count(subject) FROM student_details WHERE subject != 'Science' FROM student_details AND subject != 'Maths' GROUP BY subject; HAVING subject!= 'Vancouver' AND subject!= 'Toronto';

3. SUBQUERY • Sometimes you may have more than one subqueries in your main

3. SUBQUERY • Sometimes you may have more than one subqueries in your main query. Try to minimize the number of subquery block in your query. For Example: Write the query as SELECT name FROM employee WHERE (salary, age ) = (SELECT MAX (salary), MAX (age) FROM employee_details) AND dept = 'Electronics'; Instead of : SELECT name FROM employee WHERE salary = (SELECT MAX(salary) FROM employee_details) AND age = (SELECT MAX(age) FROM employee_details) AND emp_dept = 'Electronics';

Use operator EXISTS • Use operator EXISTS, IN and table joins appropriately in your

Use operator EXISTS • Use operator EXISTS, IN and table joins appropriately in your query. a) Usually IN has the slowest performance. b) IN is efficient when most of the filter criteria is in the sub-query. c) EXISTS is efficient when most of the filter criteria is in the main query.

 • Select * from product p where EXISTS (select * from order_items o

• Select * from product p where EXISTS (select * from order_items o where o. product_id = p. product_id) • Instead of : • Select * from product p where product_id IN (select product_id from order_items

Use EXISTS instead of DISTINCT • Use EXISTS instead of DISTINCT when using joins

Use EXISTS instead of DISTINCT • Use EXISTS instead of DISTINCT when using joins which involves tables having one-to-many relationship. For Example: Write the query as • SELECT d. dept_id, d. dept FROM dept d WHERE EXISTS ( SELECT 'X' FROM employee e WHERE e. dept = d. dept); • SELECT DISTINCT d. dept_id, d. dept FROM dept d, employee e WHERE e. dept = e. dept;

Try to use UNION ALL in place of UNION. • SELECT id, first_name FROM

Try to use UNION ALL in place of UNION. • SELECT id, first_name FROM student_details_class 10 UNION ALL SELECT id, first_name FROM sports_team; • SELECT id, first_name, subject FROM student_details_class 10 UNION SELECT id, first_name FROM sports_team;