Algunas consultas consumen más recursos que otras. Por ejemplo, las consultas que devuelven grandes conjuntos de resultados y las que contienen cláusulas WHERE que no son únicas siempre consumen muchos recursos. Ningún grado de inteligencia de las bases de datos sql hacen un buen trabajode optimizacion de consultas ni pueden eliminar el costo de recursos de estas construcciones en comparación con una consulta menos compleja.
Podemos obtener los mismos resultados escribiendo diferentes consultas SQL. Pero el uso de la mejor consulta es importante cuando se considera el rendimiento. El SQL Tuning es el proceso de garantizar que las sentencias SQL que una aplicación genera se ejecutarán en el menor tiempo posible estas consultas SQL pueden ser optimizadas para un mejor rendimiento.
Técnicas de optimización o SQL Tuning
A continuacion veremos algunas técnicas de optimización
CASO 1: La consulta SQL se vuelve mas rapido si utiliza los nombres de los campos que el * como consulta de todos los campos de la tabla
SELECT * FROM clientes
Es mas optimo escribir la consulta de esta manera
SELECT id, nombre, direccion FROM clientes
CASO 2: La Clausula HAVING se utiliza para filtrar las filas despues de que se han seleccionado todas las filas.
SELECT materia, count(alumnos) cantidad_alumnos FROM inscriptos WHERE materia = 'Quimica' AND materia = 'Historia' GROUP BY materia;
Es mas optimo escribir la consulta de esta manera
SELECTmateria, count(alumnos) cantidad_alumnos FROM inscriptos GROUP BY materia HAVING materia = 'Quimica' AND materia = 'Historia'
CASO 3: A veces es posible que tengamos más de un subconsultas en la consulta principal. Veamos en el siguiente ejemplo como minimizar el bloque de subconsulta en su consulta.
Consultamos el empleado de mayor edad y mayor sueldo.
SELECT nombre FROM empleados WHERE sueldo = (SELECT MAX(sueldo) FROM empleados) AND edad = (SELECT MAX(edad) FROM empleados) AND rubro= 'Electronica';
Es mas optimo escribir la consulta de la siguinete manera
SELECT nombre FROM empleados WHERE (sueldo, edad) = (SELECT MAX (sueldo), MAX (edad) FROM empleados) AND rubro = 'Electronica';
CASO 4: Uso del operador EXISTS, IN y uniones de tablas apropiadamente en su consulta es importante ya que son transaccion que ralentizan los accesos a los datos.
Generalmente el rendimiento más lento en canda consulta.
IN es eficiente cuando la mayor parte de los criterios de filtro se encuentra en la subconsulta.
Exist es eficiente cuando la mayor parte de los criterios de filtro esta en la consulta principal.
Veamos unos ejemplos
Select * from producto p where producto_id IN (select producto_id from pedidos)
Es mas optimo escribirlo de la siguiente manera
Select * from producto where EXISTS (select * from pedidos where pedidos.product_id = producto.product_id)
Utilizar exist en lugar de DISTINCT
Ejemplo ver que categorias tienen libros disponibles
SELECT DISTINCT categorias.id, categorias.categorias FROM categorias, libros WHERE categorias.id = libros.idcategoria;
Es mas optimo escribir la consulta de la siguiente manera
SELECT DISTINCT categorias.id, categorias.categorias FROM categorias WHERE EXISTS (SELECT 'X' FROM libros WHERE libros.idcategoria= categorias.id);
Estos son algunos consejos que permitira que se ahorren recursos al momento de ejecutar consultas sql y asi tener ademas una aplicacion con respuestas mas rapidas.
group by ocupación
no me muestra nada cuado ejecuto no es mejor darle un where in ('almacenero','contador')