0% encontró este documento útil (0 votos)
215 vistas43 páginas

Optimización de Consultas SQL en Oracle

El documento describe las técnicas para optimizar consultas y el rendimiento de bases de datos. Explica que el ajuste (tuning) de bases de datos debe ser un proceso proactivo para detectar cuellos de botella y lograr menores tiempos de ejecución utilizando menos recursos. También describe los diferentes tipos de optimizadores, el uso de sugerencias, y las cuatro metas clave para mejorar rápidamente el rendimiento de Oracle: asignar suficiente memoria, cargar datos en caché, encontrar consultas problemáticas y afinar dichas consult

Cargado por

garyii
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
215 vistas43 páginas

Optimización de Consultas SQL en Oracle

El documento describe las técnicas para optimizar consultas y el rendimiento de bases de datos. Explica que el ajuste (tuning) de bases de datos debe ser un proceso proactivo para detectar cuellos de botella y lograr menores tiempos de ejecución utilizando menos recursos. También describe los diferentes tipos de optimizadores, el uso de sugerencias, y las cuatro metas clave para mejorar rápidamente el rendimiento de Oracle: asignar suficiente memoria, cargar datos en caché, encontrar consultas problemáticas y afinar dichas consult

Cargado por

garyii
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

OPTIMIZACION DE

CONSULTAS

DISEÑO DE
BASE DE DATOS
Definiendo el tuning
(afinamiento)
 El ajuste de bases de datos debe ser un
proceso proactivo encaminado a
detectar posibles cuellos de botella en el
gestor de bases de datos así como lograr
que los tiempos de ejecución de los
distintos procesos de un sistema
disminuyan, haciendo uso del menor
número de recursos posible.
afinamiento (tuning) de SQL
• Mejorar el desempeño de SQL es generalmente la
forma más efectiva de mejorar el desempeño de
las aplicaciones
• Afinar SQL no es sencillo
• Beneficios al realizar tuning:
• Mejorar el tiempo de respuesta de las aplicaciones online
• Mejorar el tiempo de las aplicaciones batch (puede llegar
el momento en que traspasen los límites permisibles  ¿+
12 horas?)
• Garantizar la escalabilidad de la aplicación
• Reducir la carga del sistema  liberar recursos para otros
propósitos
• Evitar actualizaciones innecesarias (e inútiles muchas
veces) de hardware
TUNING EN ORACLE
Causas de una respuesta pobre
Razones para un pobre desempeño RDBMS
Diseño
Programas 20%
60%

Base de Datos
17.5%
Sistema
2.5%
Source: ORACLE Performance Tuning1

precise software solutions, inc..


TIPO DE DEGRADACIÓN DE RENDIMIENTO
“Bottleneck”
Tpo. de Exponencial
Rta.

Lineal

Afinado

Volumen de
Datos
Objeciones comunes para realizar tuning:
 “El optimizador automáticamente
afina las sentencias SQL”
 “Afinar SQL no está dentro de mi área
de especialidad”
 “Yo escribo SQL, otra persona lo debe
afinar”
 “Afinaré el SQL más tarde”
 “No podemos darnos el lujo de
dedicar tiempo a afinar el SQL”
¿Cuándo se debe afinar?
 Idealmente SQL debería ser afinado en el
momento en que se escribe.
 Mientras más avanzado esté el proyecto más
difícil será realizar el tuning:
 Cambiar algunos aspectos implican cambiar
muchas otras cosas
 Una vez que SQL entra en producción, la simple
adición de un índice sobre una tabla “grande”
puede ser complejo (tiempo, restricciones
corporativas etc.)
Costo-Beneficio del tuning durante el
ciclo de vida de un sistema
Costo de Realizar
Tuning

Costo
de la
Mejora

Mejora del
Desempeño

Diseño Desarrollo Pruebas Producción


Etapa del Ciclo de Vida
Impacto del Tuning

Diseño de la BD

Tuning SQL

Compra de
nuevo hardware

Tuning del Servidor

Tuning del Sistema


Operativo
Tuning de la Aplicación
(sin incluir SQL)
Posible Mejora
Condiciones para realizar tuning:
• Volúmenes de datos reales: Realizar
tuning contra tablas vacías o con pocos
registros es prácticamente inútil.
Alternativas:
• Probar en el ambiente real antes de entrar
en producción
• Trabajar en un ambiente con tablas a
escala de las reales, por ejemplo un 25%
del tamaño de las tablas “grandes” y un
100% de las tablas “pequeñas” (tablas de
referencias)
Condiciones para realizar tuning:
• Documentación de los modelos disponibles
• Los requerimientos del sistema han sido expuestos
• ¡Si el diseño está mal, el tuning puede ser inútil!
• Aunque el SQL esté afinado, si el servidor no lo
está, esto podría impedir el logro de las
expectativas… Afinar el servidor de la BD
El proceso de afinamiento de SQL:
Sentencia SQL Generar plan de Si
inicial Ejecución ¿Se ha logrado la
optimización deseada?

Terminar
El tuning No
Es un proceso Afinar SQL
Formular un nuevo
iterativo plan de Ejecución

Reescribir la Adicionar o Quitar


Usar Hints
Sentencia SQL índices
Rediseño de tablas
AFINAMIENTO EN ORACLE
 Las bases de datos necesitan técnicas para
mejorar su rendimiento, por lo que su
afinamiento es imprescindible para obtener su
máximo aprovechamiento.

 Cuatro grandes áreas de gran importancia para


lograr ese objetivo.
4 Metas de Oracle para impactar
rápidamente

1-Localizar suficiente memoria para Oracle.

2-Conseguir los datos cargados en la memoria (cache).

3-Buscando queries problemáticos que afectan la


memoria e I/O.

4-Afinando los queries problemáticos


Meta # 1: ¿tenemos
suficiente memoria localizada
para Oracle ?
¿Cómo vemos lo que
tenemos activado ?

 DB_BLOCK_BUFFERS

 SHARED_POOL_SIZE

 SORT_AREA_SIZE
A. DB_BLOCK_BUFFERS

 SiDB_BLOCK_BUFFERS es bajo, los usuarios podrían no


tener suficiente espacio en memoria para trabajar
eficientemente.

 Si
DB_BLOCK_BUFFERS es alto, el sistema podría
comenzar a hacer swap y se podría detener.
B. El SHARED_POOL_SIZE:
 Esta es la porción de memoria localizada para la
librería y el cache del diccionario de datos.

 Si
el SHARED_POOL_SIZE esta seteado demasiado
bajo no se aprovecharía adecuadamente el
DB_BLOCK_BUFFERS.
Declaraciones que generan
Segmentos Temporales
 Create Index...
 Select .... Order By, Distinct, Group By,
Union, Intersect, Minus
 Unindexed Joins & Correlated Subqueries
 El valor por defecto de la magnitud inicial
para los segmentos temporales debe ser
por lo menos tan grande como el valor
de sort_area_size.
C. Almacenar en memoria en
lugar de en segmentos
temporales :
 El parámetro SORT_AREA_SIZE localiza memoria para
efectuar ordenamientos.
 Determina el espacio PER USER localizado en memoria
principal para cada proceso de ordenamiento.
 Si no es suficiente, los segmentos temporales son usados.
 Incrementar sort_area_size para reducir I/O a disco.
 Causa swapping si la memoria asignada es pequeña.
Meta#2: Conseguir los datos
cargados en memoria Cache
 Examina toda la tabla y liste los mas
recientemente usados.
CREATE TABLE TEST_TAB (COL1 NUMBER)
TABLESPACE USERS
CACHE;

ALTER TABLE TEST_TAB


CACHE;
NOCACHE is the Default!
Meta # 3: Encuentre los
queries PROBLEMATICOS y QUE
causan problemas de I/O

 Use
V$SQLAREA para encontrar
problemas de Queries
Meta # 4: Afinando problemas
de Queries

 Optimizadores
 Usar HINTS (sugerencias)
 Comando Analyze
 Explain Plan
 Normas Básicas de Optimización
Optimizador basado en reglas (RULE)
 Se basa en ciertas reglas para realizar las
consultas. No tiene en cuenta el estado actual de
la base de datos, ni el número de usuarios
conectados, ni la carga de datos de los objetos,
etc. Es un sistema de optimización estático, no
varía de un momento a otro.
Optimizador basado en costes
(CHOOSE)

 Se basa en las reglas básicas, pero teniendo en


cuenta el estado actual de la base de datos:
cantidad de memoria disponible,
entradas/salidas, estado de la red, etc.
Sugerencias o hints
 Un hint es un comentario dentro de una consulta
SELECT que informa a Oracle del modo en que
tiene que trazar el plan de ejecución. Los hint
deben ir junto detrás de la palabra SELECT:
 SELECT /*+ HINT */ . . .
Sugerencias o hints
Hint Descripción
/*+ CHOOSE */ Pone la consulta a costes.
/*+ RULE */ Pone la consulta a reglas.
Pone la consulta a costes y la optimiza para que devuelva todas las filas
en el menor tiempo posible. Es la opción por defecto del
/*+ ALL_ROWS */ optimizador basado en costes. Esto es apropiado para procesos en
masa, en los que son necesarias todas las filas para empezar a
trabajar con ellas.
Pone la consulta a costes y la optimiza para conseguir que devuelva la
primera fila en el menor tiempo posible. Esto es idóneo para
/*+ FIRST_ROWS */ procesos online, en los que podemos ir trabajando con las primeras
filas mientras se recupera el resto de resultados. Este hint se
desactivará si se utilizan funciones de grupo como SUM, AVG, etc.
Fuerza la utilización del índice indicado para la tabla indicada. Se puede
/*+ INDEX( tabla índice indicar el nombre de un índice (se utilizará ese índice), de varios
) */ índices (el optimizador elegirá uno entre todos ellos) o de una tabla
(se utilizará cualquier índice de la tabla).
Hace que las combinaciones de las tablas se hagan en el mismo orden
/*+ ORDERED */
en que aparecen en el join.
Calcular el coste de una consulta

 Para calcular el coste de una consulta, el


optimizador se basa en las estadísticas
almacenadas en el catálogo de Oracle, a través
de la instrucción:
 ANALYZE [TABLE,INDEX] [COMPUTE, ESTIMATE]
STATISTICS;
Explain plan
EXPLAIN PLAN FOR
SELECT ename, job, sal, dname
FROM emp, dept
WHERE emp.deptno = dept.deptno
AND NOT EXISTS
(SELECT *
FROM salgrade
WHERE emp.sal BETWEEN losal AND hisal);
Normas básicas de optimización

1. Las condiciones (tanto de filtro como de join)


deben ir siempre en el orden en que esté definido
el índice. Si no hubiese índice por las columnas
utilizadas, se puede estudiar la posibilidad de
añadirlo, ya que tener índices extra sólo penaliza
los tiempos de inserción, actualización y borrado,
pero no de consulta.
Normas básicas de optimización
2. Al crear un restricción de tipo PRIMARY KEY
o UNIQUE, se crea automáticamente un
índice sobre esa columna.
3. Para chequeos, siempre es mejor crear
restricciones (constraints) que
disparadores (triggers).
4. Hay que optimizar dos tipos de
instrucciones: las que consumen mucho
tiempo en ejecutarse, o aquellas que no
consumen mucho tiempo, pero que son
ejecutadas muchas veces.
Normas básicas de optimización
5. Generar un plan para todas las consultas de la
aplicación, poniendo especial cuidado en los
planes de las vistas, ya que estos serán incluidos
en todas las consultas que hagan referencia a la
vista
 Generar y optimizar al máximo el plan de las vistas.
Esto es importante porque el SQL de una vista, no
se ejecuta mientras que la vista no es utilizada en
una consulta,
 así que todas las consultas de esa vista se ven
afectadas por su plan. Hay que tener especial
cuidado de hacer joins entre vistas.
Normas básicas de optimización
6. Si una aplicación que funcionaba rápido,
se vuelve lenta, hay que parar y analizar
los factores que han podido cambiar. Si el
rendimiento se degrada con el tiempo, es
posible que sea un problema de volumen
de datos, y sean necesarios nuevos
índices para acelerar las búsquedas.
Cuantos más índices tenga una tabla, más
se tardará en realizar inserciones y
actualizaciones sobre la tabla, aunque
más rápidas serán las consultas.
Hay que buscar un equilibrio entre el
número de índices y su efectividad, de tal
modo que creemos el menos número
posible, pero sean utilizados el mayor
número de veces posible.
Normas básicas de optimización

7. Utilizar siempre que sea posible las mismas


consultas. La segunda vez que se ejecuta una
consulta, se ahorrará mucho tiempo de parsing y
optimización, así que se debe intentar utilizar las
mismas consultas repetidas veces.
Normas básicas de optimización

8. Las consultas más utilizadas deben encapsularse


en procedimientos almacenados. Esto es debido
a que el procedimiento almacenado se compila
y analiza una sola vez, mientras que una consulta
(o bloque PL/SQL) lanzado a la base de datos
debe ser analizado, optimizado y compilado
cada vez que se lanza.
Normas básicas de optimización

9. Los filtros de las consultas deben ser lo más


específicos y concretos posibles. Es decir: es
mucho más específico poner WHERE campo = 'a'
que WHERE campo LIKE '%a%'. Es muy
recomendable utilizar siempre consultas que
filtren por la clave primaria u otros campos
indexados.
Normas básicas de optimización

10. Hay que tener cuidado con lanzar demasiadas


consultas de forma repetida, como por ejemplo
dentro de un bucle, cambiando una de las
condiciones de filtrado. Siempre que sea posible,
se debe consultar a la base de datos una sola
vez, almacenar los resultados en la memoria del
cliente, y procesar estos resultados después.
Normas básicas de optimización
11. Evitar la condiciones IN ( SELECT…)
sustituyéndolas por joins: cuando se utiliza
un conjunto de valores en la clausula IN,
se traduce por una condición compuesta
con el operador OR. Esto es lento, ya que
por cada fila debe comprobar cada una
de las condiciones simples. Suele ser
mucho más rápido mantener una tabla
con los valores que están dentro del IN, y
hacer un join normal. Por ejemplo, esta
consulta:
SELECT * FROM datos WHERE campo IN ('a',
'b', 'c', 'd', ... , 'x', 'y', 'z');
SELECT * FROM datos d, letras l WHERE
d.campo = l.letra;
Normas básicas de optimización

12. También hay que tener cuidado cuando se mete


un SELECT dentro del IN, ya que esa consulta
puede retornar muchas filas, y se estaría cayendo
en el mismo error. Normalmente, una condición
del tipo "WHERE campo IN (SELECT...)" se puede
sustituir por una consulta con join.
Normas básicas de optimización
13. Cuando se hace una consulta multi-tabla con
joins, el orden en que se ponen las tablas en el
FROM influye en el plan de ejecución. Aquellas
tablas que retornan más filas deben ir en las
primeras posiciones, mientras que las tablas con
pocas filas deben situarse al final de la lista de
tablas.
Normas básicas de optimización
14. Si en la cláusula WHERE se utilizan campos
indexados como argumentos de funciones, el
índice quedará desactivado. Es decir, si tenemos
un índice por un campo IMPORTE, y utilizamos
una condición como WHERE ROUND(IMPORTE) >
0, entonces el índice quedará desactivado y no
se utilizará para la consulta.
Normas básicas de optimización
15. Siempre que sea posible se deben evitar las
funciones de conversión de tipos de datos e
intentar hacer siempre comparaciones con
campos del mismo tipo. Si hay que hacer algún
tipo de conversión, intenta evitar el uso del cast y
aplica siempre la función de conversión sobre la
constante, y no sobre la columna.
Normas básicas de optimización
16. Una condición negada con el operador NOT
desactiva los índices

17. Una consulta calificada con la cláusula DISTINCT


debe ser ordenada por el servidor aunque no se
incluya la cláusula ORDER BY.
Normas básicas de optimización
18. Si vamos a realizar una operación de inserción,
borrado o actualización masiva, es conveniente
desactivar los índices, ya que por cada
operación individual se actualizarán.

También podría gustarte