我最近被委派优化一些现有的Oracle存储过程。每个存储过程都查询数据库并生成一个XML文件输出。其中一个存储过程需要大约20分钟才能完成执行。仔细查看后发现存在几个嵌套循环和不必要的查询。例如,与其在内部循环中进行多次查询,不如在外部查询一次并将结果缓存起来。我重写了存储过程并使用了这种方法。执行时间现在已经降至1分钟以下。
SELECT * from Employee e, Department d WHERE e.DEPT_ID = d.ID
--write data from query to XML
这更像是
FOR emp_rec in ( SELECT * from employee )
LOOP
SELECT * from Department WHERE id = emp_rec.DEPT_ID;
--write data from query to XML
END LOOP;
将所有这些情况更改为更像第一种选项的外观,极大地加快了程序的速度。我的问题是为什么?为什么在选择查询中执行连接比手动组合表更快?背后的过程是什么?