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

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

 2008-09-17 16:29:00 来源:WEB开发网   
核心提示: VALUES expr1, expr2, expr3 INTO A, B, C;如果任何两条语句之间都没有相关性,那么这一转换保留了原始序列的语义,SQL 过程的性能: 提示和技巧(3),为了说明这一点,请考虑:SET A = monthly_avg * 12;SET B = (A / 2

VALUES expr1, expr2, expr3 INTO A, B, C;

如果任何两条语句之间都没有相关性,那么这一转换保留了原始序列的语义。为了说明这一点,请考虑:

SET A = monthly_avg * 12;
SET B = (A / 2) * correction_factor;

将上面两条语句转换成:

VALUES (monthly_avg * 12, (A / 2) * correction_factor) INTO A, B;

不会保留原始的语义,因为是以“并行”方式对 INTO 关键字之前的表达式进行求值的。这意味着赋给 B 的值并不以赋给 A 的值为基础,这是原始语句预期的语义。

从多个 SQL 语句到一个 SQL 表达式

跟其它编程语言一样,SQL 语言提供了两类条件构造:过程型(IF 和 CASE 语句)和函数型(CASE 表达式)。在大多数环境中,可使用任何一种构造来表达计算,到底使用哪一种只是喜好问题。但是,使用 CASE 表达式编写的逻辑不但比使用 CASE 或 IF 语句编写的逻辑更紧凑,而且更有效。

请考虑下面的 SQL PL 代码片段:

IF (Price <= MaxPrice) THEN
 INSERT INTO tab_comp(Id, Val) VALUES(Oid, Price);
ELSE
 INSERT INTO tab_comp(Id, Val) VALUES(Oid, MaxPrice);
END IF;

IF 子句中的条件仅用于决定将什么值插入 tab_comp.Val 列中。为了避免过程层和数据流层之间的上下文切换,可利用 CASE 表达式将相同的逻辑表示成一个 INSERT 语句:

INSERT INTO tab_comp(Id, Val)
    VALUES(Oid,
       CASE
         WHEN (Price <= MaxPrice) THEN Price
         ELSE MaxPrice
       END);

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

Tags:SQL 过程 性能

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