Blogia
tecnolakis

Conceptos de Tunning SQL Oracle

 

SQL Tuning / SQL Tecnicas de Optimizacion:

1) La consulta SQL se vuelve más rápido si utiliza los nombres de las columnas reales en instrucción SELECT en lugar de que '*'.

Por ejemplo: Escriba la consulta como

SELECT id, first_name, last_name, age, subject FROM student_details;

En lugar de:

SELECT * FROM student_details;

 

2) HAVING se utiliza para filtrar las filas después de todas las filas están seleccionadas. Es como un filtro. No utilizar la cláusula HAVING para ningún otro propósito. 
Por ejemplo: Escriba la consulta como

SELECT subject, count(subject) 
FROM student_details 
WHERE subject != 'Science' 
AND subject != 'Maths' 
GROUP BY subject;

En lugar de:

SELECT subject, count(subject) 
FROM student_details 
GROUP BY subject 
HAVING subject!= 'Vancouver' AND subject!= 'Toronto';

 

3) A veces usted puede tener más de un subconsultas en la consulta principal. Trate de minimizar el número de bloque subconsulta en su consulta. 
Por ejemplo: Escriba la consulta como

SELECT name 
FROM employee 
WHERE (salary, age ) = (SELECT MAX (salary), MAX (age) 
FROM employee_details) 
AND dept = 'Electronics'; 

En lugar de:

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) Uso operador EXISTS, IN y uniones de tablas apropiadamente en su consulta. 
a) Generalmente en cuenta el rendimiento más lento. 
b) IN es eficiente cuando la mayor parte de los criterios de filtro se encuentra en la sub-consulta. 
c) EXISTS es eficiente cuando la mayor parte de los criterios de filtro en la consulta principal.

Por ejemplo: Escriba la consulta como

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

En lugar de:

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

 

5) Uso EXISTS en lugar de DISTINCT cuando se utilizan combinaciones que incluye tablas que tienen de uno a varios. 
Por ejemplo: Escriba la consulta como

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

En lugar de:

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

 

6) Trate de usar UNION ALL en lugar de UNION. 
Por ejemplo: Escriba la consulta como

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

En lugar de:

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

 

7) Tenga cuidado al utilizar las condiciones en la cláusula WHERE. 
Por ejemplo: Escriba la consulta como

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

En lugar de:

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

 

Escriba la consulta como

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

En lugar de:

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

 

Escriba la consulta como

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

En lugar de:

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

 

Escriba la consulta como

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

En lugar de:

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

 

Escriba la consulta como

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

En lugar de:

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

 

El uso no columna de expresión en un lado de la consulta porque se procesarán antes.

Escriba la consulta como

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

En lugar de:

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

 

Escriba la consulta como

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

En lugar de:

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

 

8) Utilice DECODE para evitar el escaneo de las mismas filas o se unen a la misma mesa repetitiva. DECODE también se pueden hacer en lugar de GROUP BY u ORDER BY. 
Por ejemplo: Escriba la consulta como

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

En lugar de:

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

 

9) Para almacenar objetos binarios grandes, primero colocarlos en el sistema de archivos y agregar la ruta del archivo en la base de datos.

10) Para escribir consultas que proporcionan un rendimiento eficiente seguir las reglas generales de SQL estándar.

a) Caso de uso único para todos los verbos de SQL
b) Comience todos los verbos de SQL en una nueva línea
c) Separe todas las palabras con un solo espacio 
d) Verbos alineación derecha o hacia la izquierda en el primer verbo de SQL

 

El objetivo de tunning es la puesta a punto (optimización) de las sentencias SQL, desde el punto de vista del tiempo de ejecución y consumo de recursos.

Podemos examinar el comportamiento de una sentencia SQL analizando su plan de ejecución:

  1. con la sentencia EXPLAIN PLAN
  2. con trazas TRACE

Para optimizar las sentencias SQL podemos:

  1. Crear indices adecuados y fomentar su uso (CREATE INDEX).
  2. Aplicar HINTS para modificar o influenciar las decisiones del optimizador.
  3. Actualizar estadísticas periodicamente (ANALYZE).
  4. Usar clausulas STORAGE adecuada en la creación de tablas (CREATE TABLE).
  5. Usar EXPORT IMPORT.
  6. Cuidar la programación.

En particular debemos prestar atención la sentencias SELECT que son más dadas a la complejidad.

Indices

Respecto a los indices debemos tener en cuenta:

  1. Crear índices sobre columnas lo más selectivas posibles (aquellas que reducen al máximo el espacio de búsqueda).
  2. En el caso de los índices compuestos, el orden en el que se declaran estas columnas deberá ser de la más selectiva a la menos selectiva (siempre que sea posible).
  3. En algunos casos es conveniente sustituir índices compuestos por varios índices simples.

Programación

Respecto a la programación:

  1. Limitar los accesos a tablas remotas.
  2. Utilizar la cláusula UNION ALL en lugar de UNION siempre que sea posible.
  3. Evitar el uso de llamadas a funciones PL/SQL en sentencias SQL.
  4. En cambio para determinados problemas, puede ser útil el uso de procedimientos o funciones PL/SQL almacenados en la base de datos en lugar de una sentencia SQL (con un cursor p.ej.).
  5. Considerar que hay distintas opciones para obtener el mismo resultado.
  6. El orden de las tablas en el Join puede ser importante.
  7. Se deben optimizar tambien las subconsultas.
  8. Considerar en algunos casos alternativas al Join (consultas anidadas, cláusula exists subconsulta , outer-join etc...).
  9. Revisar las consultas periodicamente, pueden no se ya optimas debido al constante cambio en el tamaño de las tablas, la distribución de los valores, el esquema etc....

0 comentarios