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

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

 2008-09-17 16:29:00 来源:WEB开发网   
核心提示: 值得注意的是,CASE 表达式可在任何希望有标量值的上下文中使用,SQL 过程的性能: 提示和技巧(4),特别地,可在赋值符号的右边使用它们,正如我们以前提到的,过程计算的性能与使用 DML 语句表达的同一个计算的性能相比会慢几个数量级,例如:IF (Name IS NOT NULL) T

值得注意的是,CASE 表达式可在任何希望有标量值的上下文中使用。特别地,可在赋值符号的右边使用它们。例如:

IF (Name IS NOT NULL) THEN
 SET ProdName = Name;
ELSEIF (NameStr IS NOT NULL) THEN
 SET ProdName = NameStr;
ELSE
 SET ProdName = DefaultName;
END IF;

可以改写成:

SET ProdName = (CASE
         WHEN (Name IS NOT NULL) THEN Name
         WHEN (NameStr IS NOT NULL) THEN NameStr
         ELSE DefaultName
        END);

实际上,这个特殊的示例有一个更好的解决方案:

SET ProdName = COALESCE(Name, NameStr, DefaultName);

使用 SQL 的一次处理一个集合语义

诸如循环、赋值和游标之类的过程化构造允许我们表达那些只使用 SQL DML 语句是不可能表达的计算。但是,当我们拥有一些可以随意使用的过程语句时,即使我们手头的计算实际上仅使用 SQL DML 语句就可表达,但转换成过程语句还是有风险的。正如我们以前提到的,过程计算的性能与使用 DML 语句表达的同一个计算的性能相比会慢几个数量级。请考虑下面的代码片段:

DECLARE cur1 CURSOR FOR SELECT col1, col2 FROM tab_comp;
OPEN cur1;
FETCH cur1 INTO v1, v2;
WHILE SQLCODE <> 100 DO
 IF (v1 > 20) THEN
  INSERT INTO tab_sel VALUES (20, v2);
 ELSE
  INSERT INTO tab_sel VALUES (v1, v2);
 END IF;
 FETCH cur1 INTO v1, v2;
END WHILE;

首先,通过应用上一节讨论的转换可以改进循环体:

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:SQL 过程 性能

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