SQL 过程的性能: 提示和技巧
2008-09-17 16:29:00 来源:WEB开发网DECLARE cur1 CURSOR FOR SELECT col1 FROM tab_comp WITH UR;
上面的查询将以隔离级别 UR 进行执行,而不管 DB2_SQLROUTINE_PREPOPTS 中指定的隔离级别。
在尝试改进游标性能时需要牢记的一个相关问题是游标的可更新能力。如果游标涉及的行是可以使用 INSERT 或 DELETE 语句中的 WHERE CURRENT OF 子句进行更新或删除,那么它就是 可删除的。当游标可删除时,DB2 必须获取行上的 互斥锁(与 共享锁相对),并且不能执行行分块。行上的互斥锁甚至可以防止其它应用程序读取该行(在互斥锁被释放之前,这些应用程序必须等待,除非它们的隔离级别是 UR),而行分块通过在一个操作中检索行块,从而减少了用于游标的数据库管理器开销。
只有不可删除的游标才可以进行行分块。这就是为什么让 DB2 了解将如何使用游标是很重要的原因。通过在 SELECT 语句中指定 FOR READ ONLY 子句,可以将游标显式地声明为不可删除,或者通过在 SELECT 语句中使用 FOR UPDATE 子句将其声明为可删除。根据该信息(并且还根据下面描述的 BLOCKING 选项),DB2 将确定是否将行分块用于给定的游标。
缺省情况下,对于那些使用 FOR READ ONLY 子句定义的游标,DB2 将始终使用行分块,除非指定了 BLOCKING NO 绑定选项。另一方面,如果使用了 BLOCKING ALL 绑定选项,那么对于含混游标(既不是定义成 FOR READ ONLY 也不是定义成 FOR UPDATE 的游标),DB2 将使用行分块。
简而言之:如果可能,则在游标定义中使用 FOR READ ONLY 子句;如果您的过程包含含混游标,那么请使用 BLOCKING ALL 绑定选项。要设置 BLOCKING 绑定选项的值,我们还可以使用 DB2_SQLROUTINE_PREPOPTS 注册表变量。例如,要将 SQL 过程的隔离级别设置为未提交的读,并将行分块设置为 BLOCKING ALL,请使用下面这条命令:
- ››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表' (数...
更多精彩
赞助商链接