WEB开发网
开发学院数据库DB2 SQL 过程的性能: 提示和技巧 阅读

SQL 过程的性能: 提示和技巧

 2008-09-17 16:29:00 来源:WEB开发网   
核心提示: db2setDB2_SQLROUTINE_PREPOPTS="ISOLATION UR BLOCKING ALL"对于返回大型结果集的过程而言,分块特别重要,SQL 过程的性能: 提示和技巧(8),通过使用 DB2_SQLROUTINE_PREPOPTS 注册表,还可以

db2set DB2_SQLROUTINE_PREPOPTS="ISOLATION UR BLOCKING ALL"

对于返回大型结果集的过程而言,分块特别重要。

通过使用 DB2_SQLROUTINE_PREPOPTS 注册表,还可以为存储过程指定其它绑定选项。

在无副作用的情况下,请使用 SQL 函数

正如我们在简介中提及的,SQL 过程和 SQL 函数是使用不同技术实现的。SQL 过程中的查询是单独编译的,每个查询都成为包中的一个节。编译是在过程创建时进行的,直到重新创建过程或者直到重新绑定其相关的包时才重新编译这些查询。

另一方面,SQL 函数中的查询是一起编译的,就好象函数体是一个查询一样。每当编译一条使用 SQL 函数的语句时,也会对 SQL 函数进行编译。

与 SQL 过程中所发生的情况不同,SQL 函数中的过程语句与数据流语句是在同一个层中执行的。因此,每当控制从过程语句流向数据流语句或相反时,并不发生上下文切换。

因为存在这些区别,所以当给定的过程代码段作为函数实现时的执行速度通常比作为过程实现时要快。但是,当然了,有一个小问题。函数只能包含那些不会改变数据库状态的语句(例如 INSERT、UPDATE 或 DELETE 语句是不允许的)。并且只允许完整 SQL PL 语言的子集出现在 SQL 函数中(不能是 CALL 语句、游标和条件处理)。

尽管有这些限制,但大多数 SQL 过程都可以在无副作用的情况下转换成 SQL 函数。例如,下面的过程:

CREATE PROCEDURE GetPrice (IN Vendor CHAR(20),
              IN Pid INT,
              OUT price DECIMAL(10,3))
LANGUAGE SQL
BEGIN
  IF Vendor = 'Vendor 1' THEN
     SET price = (SELECT ProdPrice
           FROM V1Table WHERE Id = Pid);
  ELSE IF Vendor = 'Vendor 2' THEN
     SET price = (SELECT Price
           FROM V2Table WHERE Pid = GetPrice.Pid);
  END IF;
END

上一页  3 4 5 6 7 8 9 10  下一页

Tags:SQL 过程 性能

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接