Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Desarrolladores
1
Afinamiento SQL y PL/SQL
para Desarrolladores
Introducción
2
Objetivos del Curso
3
Desarrollando Aplicaciones de
Base de Datos exitosas
4
Objetivos del Afinamiento
Reducir el tiempo que toma realizar una tarea , ó los recursos que se
necesitan para ejecutarla en el mismo tiempo.
Los componentes del sistema que se deben examinar en caso de
problemas de desempeño son:
1. Diseño de la aplicación
2. Código de la aplicación
3. Memoria
4. I/O
5. Contención de recursos
6. Sistema Operativo
7. CPU
5
Objetivos del Afinamiento de Base
de Datos
1. Minimizar
tiempo
de
respuesta
• Reduciendo
o
eliminando
las
esperas
• Poner
en
cache
la
mayor
cantidad
de
bloques
de
datos
• Acceder
al
mínimo
número
de
datos
en
disco.
2. Maximizar
la
cantidad
de
trabajo
hecha
con
los
mismos
recursos
• Reduciendo
la
utilización
de
memoria
del
sistema
• Eliminando
paging y
swapping
• Reduciendo
tiempos
de
I/O
6
Metodología Oracle de Afinamiento
1. Obtener
mediciones
del
comportamiento
del
sistema
2. Revisión
de
los
10
errores
más
frecuentes
que
se
presentan
en
Oracle
3. Construir
un
modelo
conceptual
de
lo
que
está
sucediendo,
basándose
en
los
síntomas
que
se
presentan
4. Proponer
una
serie
de
medidas
correctivas,
y
aplicarlas
en
orden
de
mayor
a
menor
beneficio.
5. Validar
el
efecto
de
los
cambios.
Determinar
si
se
cumplió
el
objetivo
,
o
se
debe
continuar
investigando.
6. Repetir
los
últimos
3
pasos
hasta
que
se
resuelvan
los
problemas.
7
Errores Top Ten
8
Por qué afinar SQL y PL/SQL ?
9
Decisiones de Diseño
10
Afinamiento SQL y PL/SQL
para Desarrolladores
SQL Tuning
11
Agenda
• Qué es
SQL
Tuning?
• DB
Tuning
vs
SQL
Tuning
• Problemas
más
comunes
• Uso
de
variables
Bind
Qué
es
SQL
Tuning?
• Proceso
de
construcción
de
sentencias
SQL
óptimas
que
logren
resultados
de
la
manera
mas
efectiva
y
eficiente
posible.
• SQL
tuning
empieza
desde
el
diseño
de
las
cláusulas
de
la
sentencia.
– Principalmente
se
revisa
las
cláusulas
FROM
y
WHERE.
A
partir
de
éstas
dos
el
optimizador
toma
las
decisiones
sobre
el
plan
de
ejecución.
Database
vs.
SQL
Tuning
• Database
tuning es
el
proceso
de
afinamiento
de
la
base
de
datos,
lo
que
incluye
la
memoria
asignada,
el
uso
de
disco,
CPU,
I/O,
y
demás
procesos
que
componen
a
la
base
de
datos.
• El
proceso
de
afinamiento
de
la
base
de
datos
también
consiste
en
la
administración
y
manipulación
de
las
estructuras
de
la
base
de
datos
como
tablas
e
índices.
• Estas
y
otras
actividades
le
corresponden
al
DBA.
• El
objetivo
del
afinamiento
de
base
de
datos
es
asegurar
que
la
base
de
datos
soporta
la
actividad
esperada
con
los
tiempos
de
respuesta
requeridos.
Database
vs.
SQL
Tuning
• SQL
tuning es
el
proceso
de
afinar
las
sentencias
SQL
que
acceden
a
la
base
de
datos.
• Estas
sentencias
SQL
incluyen
queries
y
operaciones
transaccionales
como
inserts,
updates,
y
deletes
• El
objetivo
del
afinamiento
SQL
es
escribir
sentencias
que
accedan
a
la
base
de
datos
de
la
manera
más
efectiva
aprovechando
los
recursos
de
la
base
de
datos
y
los
índices.
Database
vs.
SQL
Tuning
• Para
obtener
resultados
óptimos,
se
requieren
los
dos
tipos
de
Afinamiento.
• Una
base
de
datos
bien
afinada,
pero
con
queries
SQL
mal
diseñados
no
tiene
un
buen
desempeño.
(y
viceversa)
Sistema
complejo
• Al afinar la base de datos ,
debemos recordar que forma
parte de un sistema complejo
con muchos componentes
interrelacionados.
Problemas
más
comunes
• Mal
manejo
de
conexiones
desde
la
aplicación
hacia
la
base
de
datos.
• No
utilizar
variables
bind.
• Falta
de
índices
– full
table
scan
innecesarios
• Degradación
de
los
planes
de
ejecución
Manejo
de
conexiones
• El
proceso
de
establecer
una
conexión
a
la
base
de
datos
es
costoso
y
no
escalable.
• El
número
de
conexiones
concurrentes
a
la
base
de
datos
debe
minimizarse.
• Para
una
aplicación,
esto
requiere
manejo
de
un
pool
de
conexiones.
• Evitar
conexiones
y
desconexiones
para
cada
requerimiento
del
usuario.
SQL
Tuning:
Variables
Bind
• Una
de
las
mayores
causas
de
problemas
de
desempeño
en
sentencias
SQL
es
no
usar
variables
Bind.
select *
from emp where empno=123;
select *
from emp where empno=:empno
• :empno es una variable
que se
reemplaza en
tiempo
de
ejecución con
el
valor
que
se
requiera
para
ejecutar
la
consulta.
SQL
Tuning:
Variables
Bind
• Si
no
se
usan
variables
bind,
cada
vez
que
se
ejecuta
un
query
que
usa
constantes
,
la
base
de
datos
los
considera
como
nunca
antes
vistos.
• Esto
quiere
decir
que
el
query
deberá
pasar
por
todas
las
fases
de
parsing,
optimización
y
demás
pre-‐procesos.
• Esto
se
conoce
como
hard
parsing.
• En
contraste,
el
query
que
usa
variables
bind,
pasa
por
la
etapa
de
parse
la
primera
vez,
y
las
ejecuciones
siguientes
pueden
reutilizar
el
plan
de
ejecución
que
queda
en
el
Library
cache.
Variables
Bind:
Ejemplo
1
2
Variables
Bind:
Ejemplo
Qué
es
un Latch
?
• Cuando
no
existen
los
índices
correctos,
es
posible
que
un
query
o
sentencia
DML
realice
un
FTS
,
lo
que
quiere
decir
un
barrido
de
todas
las
filas
de
la
tabla.
• Se
debe
analizar
si
esto
constituye
un
problema
de
performance,
ya
que
dependiendo
del
tamaño
de
la
tabla
esta
opción
puede
ser
válida.
• En
el
proceso
de
afinamiento
de
queries,
es
importante
identificar
para
consultas
problemáticas
si
se
están
realizando
FTS
innecesarios.
Aprenda de los mejores
26
Introducción
• Aplicaciones
actuales
demandan
menores
tiempos
de
respuesta
de
las
bases
de
datos
• Sentencias
SQL
eficientes
necesarias
para
cumplir
SLAs
– Fracción
de
un
segundo
para
transacciones
en
línea
– Menos
de
un
segundo
para
operaciones
gráficas
– Pocos
segundos
para
reportes
en
línea
• Obtener
el
mejor
rendimiento
a
medida
que
incrementa
el
número
de
usuarios
no
es
una
tarea
sencilla
El Problema ?
Beneficios
– Eliminar tablas de
paso y
escrituras relacionadas
– Excelente alternativa a
tablas temporales globales
– Mejora el
rendimiento
– Usado en
consultas adhoc en
grandes bases
de
datos
Construcción 1:
Cláusula
With
en
SQL
WITH a1 AS – definir subquery, salario por departamento y job type
( select department_id,job_title,sum(salary) salary
from employees, jobs
where a.job_id=b.job_id
group by department_id,job_title),
b1 AS -- definir subquery, d epartamentos y sus países
(select department_id, country_name
from departments a, locations b, countries c
where a.location_id=b.location_id
and b.country_id=c.country_id)
SELECT country_name, job_title, sum(salary) -- seleccionar a p artir de los resultados
FROM a1, b1
WHERE a1.department_id=b1.department_id
GROUP BY country_name, job_title
Construcción 1:
Cláusula
With
en
SQL
• Recursive
With
Clause WITH emp(first_name, employee_id,job_title,
managers_name) AS
– Nested
With
clause (
Select first_name, employee_id,job_title,' '
– Reuse
result
set
in
a
from employees a, jobs b
where a.job_id=b.job_id
nested
loop and b.job_id='AD_PRES'
UNION ALL
• Beneficios: Select first_name,a.employee_id,b.job_title,c.first_name
managers_name
– Menor I/Os from employees a, jobs b, emp c
– Rendimiento extremo where a.job_id=b.job_id
and a.manager_id=c.employee_id
)
SELECT first_name employee_name, job_title,
managers_name
FROM emp
Construcción 1:
Cláusula
With
en
SQL
Construcción
1:
Cláusula
With
en
SQL
Matriz de Compatibilidad
INSERT ALL --Inserta al mismo tiempo en tabla actual e histórica
INTO EMPLOYEE_SALARY(employee_id,first_name,last_name,salary)
VALUES (employee_id,first_name,last_name,salary)
INTO EMPLOYEE_SALARY_HISTORY(employee_id,first_name,last_name,salary, update_date)
VALUES (employee_id,first_name,last_name,salary, update_date)
SELECT employee_id, first_name, last_name, salary, sysdate update_date
FROM EMPLOYEES;;
Característica 2:
Insert
Multitabla
Matriz de Compatibilidad
* No puede paralelizarse en tablas con bitmap indexes o index organized tables
Característica 3:
Funciones
Analíticas
Avanzadas
• Funciones
Analíticas
– Comparar
filas
dentro
de
la
misma
tabla
o
result
set SELECT
analytic_function(arg1)
– Aplicar
particiones y
over
(partition
by
expr -‐-‐partition
clause
ventanas
para
la
order
by
expr )
-‐-‐order
by
clause
comparación
rows
between
<rows>
-‐-‐ windowing
clause
– Rangos
y
percentiles,
FROM table1, table2, . . .
Análisis
Primero/Ultimo,
WHERE <join condition>;;
Análisis
lag/lead
– Top-‐N,
Movimientos
agregados
• Beneficios
– Elimina
los
self
joins
– Mejora
el
rendimiento
– Más
fácil
de
codificar
– No
requiere
afinamiento!
Característica
3:
Funciones
Analíticas
Avanzadas
Sintaxis
Analytic-Function(<Argument>,<Argument>,...)
OVER (
<Query-Partition-Clause>
<Order-By-Clause>
<Windowing-Clause>
)
PARTITION BY – divide los datos en grupos
ORDER BY – ordena los datos dentro de cada partición
WINDOWING – filas o rangos de filas sobre las que se va a trabajar
Característica
3:
Funciones
Analíticas
Avanzadas
Filas
Proceso Analítico
Evaluación Ordenamiento
Evaluación Agrupamiento HAVING Intermedio
WHERE
Función
Analítica
ORDER BY
Final
Resultado
Característica
3:
Funciones
Analíticas
Avanzadas
RANK() y DENSE_RANK()
SELECT ROW_NUMBER() OVER(ORDER BY sal DESC) rownumber
,RANK() OVER(ORDER BY sal DESC) rank
,DENSE_RANK() OVER(ORDER BY sal DESC) denserank
,sal
,ename
FROM emp
ORDER BY sal DESC,ename;
ROWNUMBER RANK DENSERANK SAL ENAME
--------- ---- ---------- ----- ------
1 1 1 5000 KING
2 2 2 3000 FORD
3 2 2 3000 SCOTT
4 4 3 2975 JONES
5 5 4 2850 BLAKE
6 6 5 2450 CLARK
7 7 6 1600 ALLEN
8 8 7 1500 TURNER
9 9 8 1300 MILLER
10 10 9 1250 MARTIN
11 10 9 1250 WARD
12 12 10 1100 ADAMS
13 13 11 950 JAMES
14 14 12 800 SMITH
Particionamiento
Las funciones analíticas pueden aplicarse a grupos lógicos dentro del conjunto de
resultados
Partitions
... OVER(PARTITION BY mgr ORDER BY sal DESC)
SELECT ename
,mgr
,sal
,RANK() OVER(PARTITION BY mgr ORDER BY sal DESC) m_rank
FROM emp
ORDER BY mgr
,m_rank;
ENAME MGR SAL M_RANK
---------- ---------- ---------- ----------
SCOTT 7566 3000 1
FORD 7566 3000 1
ALLEN 7698 1600 1
TURNER 7698 1500 2
WARD 7698 1250 3
MARTIN 7698 1250 3
JAMES 7698 950 5
MILLER 7782 1300 1
ADAMS 7788 1100 1
JONES 7839 2975 1
BLAKE 7839 2850 2
CLARK 7839 2450 3
SMITH 7902 800 1
KING 5000 1
Agregación:
La
cláusula
OVER
SELECT deptno
,AVG(sal)
FROM emp SELECT deptno
GROUP BY deptno; ,AVG(sal) OVER (PARTITION BY deptno) avg_dept
,AVG(sal) OVER () avg_all
DEPTNO AVG(SAL) FROM emp;
---------- ---------- No subclause
30 1566.66667 DEPTNO AVG_DEPT AVG_ALL
20 2175 ---------- ---------- ----------
10 2916.66667 10 2916.66667 2073.21429
10 2916.66667 2073.21429
10 2916.66667 2073.21429
20 2175 2073.21429
20 2175 2073.21429
20 2175 2073.21429 Agregaciones
20 2175 2073.21429 analíticas
20 2175 2073.21429 no reducen el
30 1566.66667 2073.21429
número de filas
30 1566.66667 2073.21429
30 1566.66667 2073.21429
30 1566.66667 2073.21429
30 1566.66667 2073.21429
30 1566.66667 2073.21429
Analytics
vs
SQL
convencional
Si se requiere datos a distintos niveles de agrupación
Salario promedio
por departamento
ENAME SAL DEPTNO AVG_DEPT AVG_ALL
------ ---- ------ ---------- ----------
CLARK 2450 10 2916.66667 2073.21429
KING 5000 10 2916.66667 2073.21429
MILLER 1300 10 2916.66667 2073.21429 Salario promedio
JONES 2975 20 2175 2073.21429 total
FORD 3000 20 2175 2073.21429
ADAMS 1100 20 2175 2073.21429
SMITH 800 20 2175 2073.21429
SCOTT 3000 20 2175 2073.21429
WARD 1250 30 1566.66667 2073.21429
TURNER 1500 30 1566.66667 2073.21429
ALLEN 1600 30 1566.66667 2073.21429
JAMES 950 30 1566.66667 2073.21429
BLAKE 2850 30 1566.66667 2073.21429
MARTIN 1250 30 1566.66667 2073.21429
Performance del SQL
convencional
SELECT r.ename,r.sal,g.deptno,g.ave_dept,a.ave_all
FROM emp r
,(SELECT deptno,AVG(sal) ave_dept
FROM emp GROUP BY deptno) g
,(SELECT AVG(sal) ave_all
FROM emp) a
WHERE g.deptno = r.deptno
ORDER BY r.deptno;
-----------------------------------------------
| Id | Operation | Name | Rows |
-----------------------------------------------
| 0 | SELECT STATEMENT | | 15 |
| 1 | MERGE JOIN | | 15 |
| 2 | SORT JOIN | | 3 | 1M de empleados
| 3 | NESTED LOOPS | | 3 |
| 4 | VIEW | | 1 | 48.35 segundos
| 5 | SORT AGGREGATE | | 1 |
| 6 | TABLE ACCESS FULL| EMP | 14 |
| 7 | VIEW | | 3 |
| 8 | SORT GROUP BY | | 3 |
| 9 | TABLE ACCESS FULL| EMP | 14 |
|* 10 | SORT JOIN | | 14 |
| 11 | TABLE ACCESS FULL | EMP | 14 |
-----------------------------------------------
Performance del SQL
analítico
SELECT ename,sal,deptno
,AVG(sal) OVER (PARTITION BY deptno) ave_dept
,AVG(sal) OVER () ave_all
FROM emp;
-------------------------------------------
| Id | Operation | Name | Rows |
-------------------------------------------
| 0 | SELECT STATEMENT | | 14 |
| 1 | WINDOW SORT | | 14 | 1M de empleados
| 2 | TABLE ACCESS FULL| EMP | 14 |
------------------------------------------- 21.20 segundos
Característica
3:
Funciones
Analíticas
Avanzadas
SELECT first_name, department_id, salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC ) RANK, --function Rank()
LAG(salary) OVER (PARTITION BY department_id ORDER BY salary DESC ) PREV_HIGH_SAL
-- function Lag()
FROM employees
WHERE department_id IN (10, 20,30,40)
ORDER BY 2, RANK;;
Característica
3:
Funciones
Analíticas
Avanzadas
Matriz de Compatibilidad
60