Ejemplo de reescritura del compilador: fusión de operaciones
Una sentencia SELECT que utiliza vistas puede restringir el orden de unión de la tabla y también puede introducir la unión redundante de tablas. Si las vistas se fusionan durante la reescritura de consultas, estas restricciones se pueden eliminar.
create view emp_education (empno, firstnme, lastname, edlevel) as
select empno, firstnme, lastname, edlevel
from employee
where edlevel > 17
create view emp_salaries (empno, firstname, lastname, salary) as
select empno, firstnme, lastname, salary
from employee
where salary > 35000 select e1.empno, e1.firstnme, e1.lastname, e1.edlevel, e2.salary
from emp_education e1, emp_salaries e2
where e1.empno = e2.empno select e1.empno, e1.firstnme, e1.lastname, e1.edlevel, e2.salary
from employee e1, employee e2
where
e1.empno = e2.empno and
e1.edlevel > 17 and
e2.salary > 35000Al fusionar las sentencias SELECT de las dos vistas con la sentencia SELECT escrita por el usuario, el optimizador puede considerar más opciones al seleccionar un plan de acceso. Además, si las dos vistas que se han fusionado utilizan la misma tabla base, es posible que se realice una reescritura adicional.
Ejemplo: subconsulta para unir transformaciones
select empno, firstnme, lastname, phoneno
from employee
where workdept in
(select deptno
from department
where deptname = 'OPERATIONS')y conviértalo en una consulta de unión con el formato: select distinct empno, firstnme, lastname, phoneno
from employee emp, department dept
where
emp.workdept = dept.deptno and
dept.deptname = 'OPERATIONS'Una unión es generalmente mucho más eficiente de ejecutar que una subconsulta.
Ejemplo: eliminación de unión redundante
select e1.empno, e1.firstnme, e1.lastname, e1.edlevel, e2.salary
from employee e1,
employee e2
where e1.empno = e2.empno
and e1.edlevel > 17
and e2.salary > 35000 select empno, firstnme, lastname, edlevel, salary
from employee
where
edlevel > 17 and
salary > 35000 create view peplview as
select firstnme, lastname, salary, deptno, deptname, mgrno
from employee e department d
where e.workdept = d.deptno select lastname, salary
from peplviewse convierte en: select lastname, salary
from employee
where workdept not nullTenga en cuenta que en esta situación, incluso si sabe que la consulta se puede volver a escribir, es posible que no pueda hacerlo porque no tiene acceso a las tablas subyacentes. Es posible que sólo tenga acceso a la vista (mostrada anteriormente). Por lo tanto, el gestor de bases de datos debe realizar este tipo de optimización.
- Las vistas se definen con uniones
- Las consultas se generan automáticamente
Ejemplo-Agregación compartida
select sum(salary+bonus+comm) as osum,
avg(salary+bonus+comm) as oavg,
count(*) as ocount
from employeey lo transforma: select osum, osum/ocount ocount
from (
select sum(salary+bonus+comm) as osum,
count(*) as ocount
from employee
) as shared_aggEsta reescritura reduce a la mitad el número necesario de sumas y recuentos.