WEB开发网
开发学院数据库DB2 通过 DB2 TPC-C 基准实现探索 SQL 阅读

通过 DB2 TPC-C 基准实现探索 SQL

 2008-09-17 16:31:49 来源:WEB开发网   
核心提示: 相反, 数据更改操作 应该限制在公共表表达式(CTE,通过 DB2 TPC-C 基准实现探索 SQL(7),也叫做“WITH 子句”)的顶层 SELECT 或最上面的 SELECT 中,在上述例子中,一次用于最后的 SELECT? 答案很简单:就像 SORT 一样,

相反, 数据更改操作 应该限制在公共表表达式(CTE,也叫做“WITH 子句”)的顶层 SELECT 或最上面的 SELECT 中。在上述例子中,整个过程是这样的: DATA 执行一个 数据更改操作,并作为 CTE 放在 WITH 子句中。 现在它可以为 INSERT 操作提供数据了。

为什么要有这些规则?让 数据更改操作 留在 WITH 子句中,实际上便强加了一个非常自然的顺序,这样可用于解决冲突。

最后,在这个事务中还暴露了有关 数据更改操作 的另一个更新颖的特性: 那就是 INCLUDE-子句,像任何其他 数据更改语句 一样,INSERT 可以使用这个子句。这个子句允许通过附加额外的列来 扩展 OLD TABLE 或 NEW TABLE 过渡表。这些列只是通过 INSERT 操作搭载的,并且上面的 SELECT 可以访问这些列。在这个例子中,产品价格、名称、数据以及有关库存的数据不是 ORDER_LINE 表的一部分。这些列只是暂时传递、用以返回给用户的。

为什么会这么混乱呢?为什么不从 DATA 选择两次 —— 一次用于 INSERT,一次用于最后的 SELECT? 答案很简单:就像 SORT 一样,TEMP 是一个“4 个字母的单词”。

如果没有看 NEW_OL_LOCAL 表函数,那么对 NEW ORDER 事务的探索就不算完:

清单 5. NEW_OL_LOCAL 表函数

1
    CREATE FUNCTION NEW_OL_LOCAL(  I_ID   INTEGER
2                , I_QTY   SMALLINT
3                , W_ID   INTEGER
4                , O_ID   INTEGER
5                , D_ID   SMALLINT
6                , OL_NUMBER SMALLINT
7               )
8
    RETURNS TABLE(  I_PRICE    INTEGER
9        , I_NAME    CHAR(24)
0        , I_DATA    VARCHAR(50)
11        , OL_DIST_INFO CHAR(24)
12        , S_DATA    VARCHAR(50)
13        , S_QUANTITY  SMALLINT
14       )
15
    SPECIFIC NEW_OL_LOCAL
16
    MODIFIES SQL DATA DETERMINISTIC NO EXTERNAL ACTION LANGUAGE SQL
17
18 VAR:
    BEGIN ATOMIC
19 
    DECLARE I_PRICE    INTEGER   ;
20 
    DECLARE I_NAME    CHAR(24)   ;
21 
    DECLARE I_DATA    VARCHAR(50) ;
22 
    DECLARE OL_DIST_INFO CHAR(24)   ;
23 
    DECLARE S_DATA    VARCHAR(50) ;
24 
    DECLARE S_QUANTITY  SMALLINT   ;
25
26 
    SET ( I_PRICE , I_NAME , I_DATA )
27   = (
    SELECT
28          I_PRICE
29         , I_NAME
30         , I_DATA
31
32      
    FROM ITEM
33     
    WHERE ITEM.I_ID = NEW_OL_LOCAL.I_ID
34    )
35   ;
36  
    SET ( OL_DIST_INFO , S_DATA , S_QUANTITY )
37    = (
    SELECT  OL_DIST_INFO
38         , S_DATA
39         , S_QUANTITY
40      
    FROM NEW TABLE (
    UPDATE STOCK
41                
    INCLUDE ( OL_DIST_INFO CHAR( 24 ) )
42                
    SET S_QUANTITY =
    CASE WHEN S_QUANTITY - NEW_OL_LOCAL.I_QTY >= 10
43                           
    THEN S_QUANTITY - NEW_OL_LOCAL.I_QTY
44                           
    ELSE S_QUANTITY - NEW_OL_LOCAL.I_QTY + 91
45                        
    END
46                 , S_ORDER_CNT = S_ORDER_CNT + 1
47                 , S_YTD    = S_YTD + NEW_OL_LOCAL.I_QTY
48                 , OL_DIST_INFO =
    CASE D_ID
    WHEN 1
    THEN S_DIST_01
49                              
    WHEN 2
    THEN S_DIST_02
50                              
    WHEN 3
    THEN S_DIST_03
51                              
    WHEN 4
    THEN S_DIST_04
52                              
    WHEN 5
    THEN S_DIST_05
53                              
    WHEN 6
    THEN S_DIST_06
54                              
    WHEN 7
    THEN S_DIST_07
55                              
    WHEN 8
    THEN S_DIST_08
56                              
    WHEN 9
    THEN S_DIST_09
57                              
    WHEN 10
    THEN S_DIST_10
58                         
    END
59                
    WHERE S_I_ID = NEW_OL_LOCAL.I_ID
60                 
    AND S_W_ID = NEW_OL_LOCAL.W_ID 
61              )
    AS U
62    )
63  ;
64  
    RETURN VALUES(  VAR.I_PRICE
65          , VAR.I_NAME
66          , VAR.I_DATA
67          , VAR.OL_DIST_INFO
68          , VAR.S_DATA
69          , VAR.S_QUANTITY
70         )
71  ;
72
    END

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

Tags:通过 DB TPC

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