Jumat, 20 September 2013

SQL Tuning / Teknik Optimasi SQL:


1) Permintaan sql menjadi lebih cepat jika menggunakan kolom nama sebenarnya dalam pernyataan SELECT bukan dari '*'.

Untuk Contoh: Menulis query sebagai
SELECT id, first_name, last_name, age, subject FROM student_details;
Daripada:
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 subject, count(subject)
FROM student_details
WHERE subject != 'Science'
AND subject != 'Maths'
GROUP BY subject;
Daripada:
SELECT subject, count(subject)
FROM student_details
GROUP BY subject
HAVING subject!= 'Vancouver' AND subject!= 'Toronto';

3) Kadang-kadang kita mungkin memiliki lebih dari satu subqueries dalam query utama. Kita harus mencoba untuk meminimalkan jumlah blok subquery dalam permintaan kita.
Untuk Contoh: Menulis query sebagai
SELECT name
FROM employee
WHERE (salary, age ) = (SELECT MAX (salary), MAX (age)
FROM employee_details)
AND dept = 'Electronics';
Daripada:
SELECT name
FROM employee
WHERE salary = (SELECT MAX(salary) FROM employee_details)
AND age = (SELECT MAX(age) FROM employee_details)
AND emp_dept = 'Electronics';

4) Operator gunakan EXISTS dan IN. a) Biasanya IN memiliki kinerja paling lambat. b) IN efisien ketika sebagian besar kriteria filter ada dalam sub-query. c) EXISTS efisien ketika sebagian besar kriteria filter ada 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)
Daripada:
Select * from product p
where product_id IN
(select product_id from order_items

5) Penggunaan EXISTS bukan DISTINCT ketika menggunakan gabungan yang melibatkan tabel dengan hubungan one-to-many.
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);
Daripada:
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;
Daripada:
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;
Daripada:
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%';
Daripada:
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, '%');
Daripada:
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)
Daripada:
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';
Daripada:
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;
Daripada:
SELECT id, name, salary
FROM employee
WHERE salary + 10000 < 35000;

Menulis query sebagai
SELECT id, first_name, age
FROM student_details
WHERE age > 10;
Daripada:
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';
Daripada:
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 pertanyaan 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

Tidak ada komentar:

Posting Komentar