Beispiel für das Umschreiben durch den Compiler: Zusammenfügen von Operationen
Eine SELECT-Anweisung, die Sichten verwendet, kann die Joinfolge der Tabelle einschränken und zudem überflüssige Joins von Tabellen nach sich ziehen. Wenn die Sichten während des Umschreibens der Abfrage zusammengefügt werden, können diese Einschränkungen aufgehoben werden.
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 > 35000Durch das Zusammenfügen der Anweisungen SELECT der beiden Sichten mit der vom Benutzer geschriebenen Anweisung SELECT kann das Optimierungsprogramm mehr Möglichkeiten bei der Auswahl des Zugriffsplans in Betracht ziehen. Darüber hinaus kann die Abfrage noch weiter umgeschrieben werden, wenn die beiden zusammengefügten Sichten dieselbe Basistabelle verwenden.
Beispiel - Umsetzungen von Unterabfragen in Joins
select empno, firstnme, lastname, phoneno
from employee
where workdept in
(select deptno
from department
where deptname = 'OPERATIONS')Diese Unterabfrage wird vom SQL-Compiler in eine
Joinabfrage der folgenden Form umgewandelt: select distinct empno, firstnme, lastname, phoneno
from employee emp, department dept
where
emp.workdept = dept.deptno and
dept.deptname = 'OPERATIONS'Im Allgemeinen ist ein Join in der Ausführung wesentlich effektiver als eine Unterabfrage.
Beispiel - Eliminierung überflüssiger Joins
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 peplviewwird wie folgt umgeschrieben: select lastname, salary
from employee
where workdept not nullBeachten Sie in diesem Fall, dass Sie die Abfrage eventuell nicht umschreiben können, selbst wenn Sie wissen, dass dies möglich ist, weil Sie keinen Zugriff auf die zugrunde liegenden Tabellen haben. Sie haben möglicherweise nur Zugriff auf die (oben gezeigte) Sicht. Daher muss dieser Typ von Optimierung vom Datenbankmanager ausgeführt werden.
- Sichten sind mit Joins definiert.
- Abfragen werden automatisch generiert.
Beispiel - Gemeinsame Spaltenberechnungen
select sum(salary+bonus+comm) as osum,
avg(salary+bonus+comm) as oavg,
count(*) as ocount
from employeeDiese Abfrage wird wie folgt umgeformt: select osum, osum/ocount ocount
from (
select sum(salary+bonus+comm) as osum,
count(*) as ocount
from employee
) as shared_aggDurch dieses Umschreiben wird die Anzahl der erforderlichen
Summierungen und Zählungen halbiert.