Está en la página 1de 13

Base de Datos 2

Bibliografía de referencia: Bases de Datos – Diseño, Implementación y Administración – Coronel,


Morris y Rob – 9na edición – Capítulo 11

Practica 1: Optimización de Querys


Objetivo: Conocer el funcionamiento del módulo de Optimización de Querys, lo que permitirá escribir
querys más eficientes y solucionar problemas de performance del lado del cliente.
Procesamiento de Consultas

Query Parser

Query Optimizer
Optimización
 El objetivo del optimizador es generar y elegir un plan de
ejecución suficientemente eficiente

 Como el SQL es un lenguaje declarativo no podemos decirle


al optimizador cómo ejecutar la consulta.
 Pero podemos en principio influir en sus decisiones :
 Escribiendo la consulta de forma de obtener un plan
inicial suficientemente eficiente (PARTE I) ó
 Creando índices que reduzcan el costo de acceso a los
datos (PARTE 2)
Desarrollo de la práctica

PARTE I: Escribir querys posiblemente más eficientes.

 Obtener el plan de ejecución inicial de las consultas


planteadas en un árbol de operaciones del AR.
 Mejorar el plan obtenido aplicando reglas que reduzcan el
tamaño de los resultados intermedios y el costo de acceso
(sólo lecturas).
 Traducir el plan de ejecución a una sentencia SQL.
Desarrollo de la práctica

PARTE II: Mostrar en un DBMS el plan de ejecución de los querys y


cómo lograr menor tiempo de respuesta.

 Mostrar en una base real, en un DBMS, el plan de


ejecución de una consulta. Uso del EXPLAIN.
 Influir en las decisiones del optimizador con la creación de
índices.
Ejercicio 1
Dado el siguiente modelo relacional:

PRODUCTOS (idproducto, código, descripción, precio, vendedor)


FK (idvendedor, VENDEDORES) la clave foránea no permite nulos
VENDEDORES ( idvendedor, nombre_vendedor, sucursal)

Y la consulta: “Listar los datos de los productos que vende la sucursal de JUNIN”

SELECT p.codigo, p.descripción, p.precio, v.nombre_vendedor


FROM PRODUCTOS p, VENDEDORES v
WHERE p.vendedor = v.idvendedor and v.sucursal = ´JUNIN´;

Sabiendo que: Se pide:


a) Construir el árbol inicial de la
- CT(productos) = 7000 consulta.
- CT(vendedores) = 300 b) Suponiendo que solo evaluamos
la cantidad de lecturas con costo
- CV (sucursal = ‘JUNIN’, vendedores) = 10 constante igual a 1, hallar el plan de
- 1000 productos de vendedores de JUNIN ejecución que resulte del árbol con
menor costo total.
Ejercicio 1

 Árbol Inicial
Mejora 1:

- CT(productos) = 7000
- CT(vendedores) = 300
- CV (sucursal = ‘JUNIN’, vendedores) = 10
- 1000 productos de vendedores de JUNIN

Plan Pasos Operación Cantidad Costo de Cantidad Costo


de lecturas acceso de Tuplas Total
A 1 Productos X Vendedores 7.000 + 300 7.300 2.100.000 7.300

2 2.100.000 2.100.000 7.000 2.107.300


 (A1) p.vendedor =
v.idvendedor

3 7.000 7.000 1.000 2.114.300


 (A2) sucursal=
´JUNIN´
Mejora 2:

- CT(productos) = 7000
- CT(vendedores) = 300
- CV (sucursal = ‘JUNIN’, vendedores) = 10
- 1000 productos de vendedores de JUNIN

Plan Paso Operación Cantidad Costo de Cantidad Costo


de lecturas acceso de Tuplas Total
B 1 300 300 10 300
 sucursal = ´JUNIN´
(vendedores)
2 PRODUCTOS X B1 7.000 + 10 7.010 70.000 7.310

3 70.000 70.000 1.000 77.310


(B2) p.vendedor =
v.idvendedor
Mejora 3:

- CT(productos) = 7000
- CT(vendedores) = 300
- CV (sucursal = ‘JUNIN’, vendedores) = 10
- 1000 productos de vendedores de JUNIN

Plan Nivel Operación Cantidad Costo de Cantidad Costo


de lecturas acceso de Tuplas Total

C 1 300 300 10 300


 (vendedores)
sucursal = ´JUNIN´
2 PRODUCTOS Ix I C1 10 + 7.000 7.010 1.000 7.310
Ejercicio 1: Resumen
Plan Pasos Operación Cantidad Costo de Cantidad Costo
de lecturas acceso de Tuplas Total

A 1 Productos X Vendedores 7.000 + 300 7.300 2.100.000 7.300

2  (A1) p.vendedor = 2.100.000 2.100.000 7.000 2.107.300


v.idvendedor

7.000 7.000 1.000 2.114.300


3  (A2) sucursal= ´JUNIN´

 sucursal = ´JUNIN´
B 1 (vendedores)
300 300 10 300

2 B1 x PRODUCTOS 10 + 7.000 7.010 70.000 7.310

3 (B2) p.vendedor = 70.000 70.000 1.000 77.310


v.idvendedor

C 1  (vendedores) 300 300 10 300


sucursal = ´JUNIN´

2 PRODUCTOS IxI C1 10 + 7.000 7.010 1.000 7.310


Ejercicio 1
 Reescribimos el Query inicial usando el último árbol:
CONSULTA ORIGINAL:
SELECT p.producto, p.descripción, p.precio, v.nombre_vendedor
FROM PRODUCTOS p, VENDEDORES v
WHERE p.vendedor = v.idvendedor and v.sucursal = ´JUNIN´;

CONSULTA RE-ESCRITA PARA LOGRAR MAYOR EFICIENCIA:


SELECT p.codigo, p.descripcion, p.precio, v.nombre_vendedor
FROM Productos p INNER JOIN (SELECT Idvendedor, nombre_vendedor
FROM Vendedores v
WHERE v.sucursal = ‘JUNIN’) as v ON v.idvendedor = p.vendedor

CONSULTA MÁS LEGIBLE:


SELECT p.codigo, p.descripcion, p.precio, v.nombre_vendedor
FROM Productos p INNER JOIN Vendedores v ’) as v ON v.idvendedor = p.vendedor
WHERE v.sucursal = ‘JUNIN’
Gracias !!

También podría gustarte