Monday, November 12, 2012

Tuning SQL atau Optimalisasi SQL

 
TUNING SQL

Pada Penulisan berikut saya akan mencoba sedikit menjelaskan apa yang saya ketahui tentang tuning SQL.
Sql digunakan untuk mengambil data dari database. Kita bisa mendapatkan hasil yang sama dengan menulis query sql yang berbeda. Tapi penggunaan query terbaik adalah penting ketika kinerja dianggap. Jadi, Anda perlu untuk tuning query sql berdasarkan kebutuhan. Berikut adalah daftar query yang kita gunakan seperti biasa, dan berikut saya jelaskan tentang bagaimana query sql dapat dioptimalkan untuk kinerja yang lebih baik. 
SQL Tuning / SQL Optimasi Teknik:
1) Permintaan sql menjadi lebih cepat jika Anda menggunakan kolom nama sebenarnya dalam pernyataan SELECT bukan dari '*'.

Untuk Contoh: 
Menulis query sebagai

SELECT id, first_name, last_name, usia, subjek FROM student_details;

Sebagai gantinya:
SELECT * FROM student_details;

2) klausa HAVING digunakan untuk menyaring baris setelah semua baris yang dipilih. Hal ini seperti filter. Jangan gunakan klausa HAVING untuk tujuan lain. 
Untuk Contoh: 
Menulis query sebagai

 SELECT subjek, count (subjek) FROM student_details

      WHERE subjek = 'Ilmu'! AND subjek = 'Matematika'! 

   GROUP BY subjek ;

Sebagai gantinya:

 SELECT subjek, count (subjek) FROM student_details

     GROUP BY subjek

   HAVING subjek = 'Vancouver' AND subjek = 'Toronto'!!;

3) Kadang-kadang Anda mungkin memiliki lebih dari satu subqueries dalam query utama Anda. Cobalah untuk meminimalkan jumlah blok subquery dalam permintaan Anda.
Untuk Contoh: 
Menulis query sebagai

 SELECT nama FROM karyawan 

     WHERE (gaji, usia) = (SELECT MAX (gaji), MAX (umur)

   FROM employee_details)

   AND dept = 'Elektronik';

Sebagai gantinya:

 SELECT nama FROM karyawan

      WHERE gaji = (SELECT MAX (gaji) FROM employee_details)

   AND usia = (SELECT MAX (umur) FROM employee_details)

   AND emp_dept = 'Elektronik';

4) Gunakan operator EXISTS, IN dan meja bergabung tepat dalam permintaan Anda. 
a) Biasanya IN memiliki kinerja paling lambat.
b) IN efisien ketika sebagian besar kriteria filter dalam sub-query. 
c) EXISTS adalah efisien ketika sebagian besar kriteria filter dalam query utama.

Untuk Contoh: 
Menulis query sebagai

Select * from product p
where EXISTS (select * from order_items o
where o.product_id = p.product_id)

Sebagai gantinya:

Select * from product p
where product_id IN
(select product_id from order_items

5) Penggunaan EXISTS bukan DISTINCT ketika menggunakan bergabung yang melibatkan tabel memiliki satu-ke-banyak hubungan. 
Untuk Contoh: 
Menulis query sebagai

SELECT d.dept_id, d.dept
FROM dept d
WHERE EXISTS ( SELECT 'X' FROM employee e WHERE e.dept = d.dept);

Sebagai gantinya:

SELECT DISTINCT d.dept_id, d.dept
FROM dept d,employee e
WHERE e.dept = e.dept;

6) Cobalah untuk menggunakan UNION ALL di tempat UNION.
Untuk Contoh: 
Menulis query sebagai

SELECT id, first_name
FROM student_details_class10
UNION ALL
SELECT id, first_name
FROM sports_team;

Sebagai gantinya:

SELECT id, first_name, subject
FROM student_details_class10
UNION
SELECT id, first_name
FROM sports_team;

7) Berhati-hatilah saat menggunakan kondisi di klausa WHERE.
Untuk Contoh: 
Menulis query sebagai

SELECT id, first_name, age FROM student_details WHERE age > 10;

Sebagai gantinya:

SELECT id, first_name, age FROM student_details WHERE age != 10;

Menulis query sebagai
SELECT id, first_name, age
FROM student_details
WHERE first_name LIKE 'Chan%';

Sebagai gantinya:

SELECT id, first_name, age
FROM student_details
WHERE SUBSTR(first_name,1,3) = 'Cha';

Menulis query sebagai

SELECT id, first_name, age
FROM student_details
WHERE first_name LIKE NVL ( :name, '%');

Sebagai gantinya:

SELECT id, first_name, age
FROM student_details
WHERE first_name = NVL ( :name, first_name);

Menulis query sebagai

SELECT product_id, product_name
FROM product
WHERE unit_price BETWEEN MAX(unit_price) and MIN(unit_price)

Sebagai gantinya:

SELECT product_id, product_name
FROM product
WHERE unit_price >= MAX(unit_price)
and unit_price <= MIN(unit_price)

Menulis query sebagai

SELECT id, name, salary
FROM employee
WHERE dept = 'Electronics'
AND location = 'Bangalore';

Sebagai gantinya:

SELECT id, name, salary
FROM employee
WHERE dept || location= 'ElectronicsBangalore';

Gunakan non-kolom ekspresi pada satu sisi permintaan karena akan diproses sebelumnya.
Menulis query sebagai

SELECT id, name, salary
FROM employee
WHERE salary < 25000;

Sebagai gantinya:

SELECT id, name, salary
FROM employee
WHERE salary + 10000 < 35000;

Menulis query sebagai

SELECT id, first_name, age
FROM student_details
WHERE age > 10;

Sebagai gantinya:

SELECT id, first_name, age
FROM student_details
WHERE age NOT = 10;

8) Gunakan DECODE untuk menghindari pemindaian baris yang sama atau bergabung dengan tabel yang sama berulang-ulang. DECODE juga bisa dibuat digunakan di tempat GROUP BY atau ORDER BY klausa. 
Untuk Contoh: 
Menulis query sebagai

SELECT id FROM employee
WHERE name LIKE 'Ramesh%'
and location = 'Bangalore';

Sebagai gantinya:

SELECT DECODE(location,'Bangalore',id,NULL) id FROM employee
WHERE name LIKE 'Ramesh%';

9) Untuk menyimpan benda-benda besar biner, pertama menempatkan mereka dalam sistem file dan menambahkan path file dalam database.

10) Untuk menulis query yang memberikan kinerja yang efisien mengikuti aturan umum SQL standar.
a) Gunakan kasus tunggal untuk semua verba SQL 
b) Mulailah semua verba SQL pada baris baru 
c) Pisahkan semua kata dengan spasi tunggal 
d) kanan atau kiri menyelaraskan kata kerja dalam kerja SQL awal

Demikianlah yang dapat saya berikan dalam penulisan kali ini, semoga ilmu yang sedikit saya punyai ini dapat berguna bagi yang memerlukannya.

Terimakasih
wassalamualaikum wr wb