调优 SQL 过程
2008-09-09 10:03:14 来源:WEB开发网为了解决第二个问题,DB2 使用了包缓存。该缓存不仅记住最近执行的过程,还记住了以前执行的语句。因此,在第一次编译 SQL 语句之后,后来的调用只要继续执行相同的执行计划即可。我们用一个例子来说明:
1 CREATE PROCEDURE get_dept_emps(dept_id dept_id_t)
2 BEGIN
3 DECLARE cur CURSOR WITH RETURN FOR
4 SELECT emp_name, emp_id FROM emp
5 WHERE emp_dept_id = dept_id;
6 OPEN cur;
7 END
注意,您可以从“下载”小节中下载带有完全 DDL 的所有例子。可以从 developerWorks 下载本文全文使用的 SQL PL Profiler。下面的屏幕快照展示了上述普通 SQL 过程的 100 次执行。
那么,时间消耗在哪些地方了呢?DB2 需要处理这条 CALL 语句。假设以前已经缓存了这个过程,那么,DB2 就需要初始化 SQL 过程,以便执行它。然后,DB2 打开从过程中返回的游标,并处理分配给结果集的定位器。最后,DB2 才可以真正取得所返回的行。做这么多工作仅仅是为了打开一个游标!
现在,让我们使用内联 SQL PL 来取得相同的效果:
1 CREATE FUNCTION get_dept_emps_f(dept_id dept_id_t)
2 RETURNS TABLE(emp_name name_t,
3 emp_id emp_id_t)
4 RETURN SELECT emp_name, emp_id
5 FROM emp
6 WHERE emp_dept_id = emp_dept_id;
我们现在用 DECLARE 游标及其各自的 OPEN 语句来替换驱动程序过程中的 CALL 和所有定位器代码,并测试结果:
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接