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

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

 2008-09-17 16:29:00 来源:WEB开发网   
核心提示: DECLARE cur1 CURSOR FOR SELECT col1, col2 FROM tab_comp;OPEN cur1;FETCH cur1 INTO v1, v2;WHILE SQLCODE <> 100 DOINSERT INTO tab_sel VALUES

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

但是通过进一步观察,我们发现整个代码块可以写成一个带有 SELECT 子句的 INSERT 语句:

INSERT INTO tab_sel (SELECT (CASE
                WHEN col1 > 20 THEN 20
                ELSE col1
               END),
               col2
           FROM tab_comp);

在原始的表述中,SELECT 语句中每行的过程层和数据流层之间都有一个上下文切换。在最后一个表述中,根本没有上下文切换,并且优化器有机会对整个计算进行全局优化。另一方面,如果每个 INSERT 语句针对的都是不同的表,那么这种引人注目的简化是不可能的,如下所示。

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_default VALUES (20, v2);
 ELSE
  INSERT INTO tab_sel VALUES (v1, v2);
 END IF;
 FETCH cur1 INTO v1, v2;
END WHILE;

但是,这里也可以利用 SQL 的一次处理一个集合(set-at-a-time)特性:

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

Tags:SQL 过程 性能

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