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

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

 2008-09-17 16:31:45 来源:WEB开发网   
核心提示: 为了发现中间的客户,这里选择了使用 ROW_NUMBER(),通过 DB2 TPC-C 基准实现探索 SQL(2)(3),这个 OLAP 函数将所有同姓的客户按照他们的名字来编号,而且,则确定送货人的 ID,以及提交订单时的日期,这里决定不使用一个单独的查询来获得总的 COUNT,相反

为了发现中间的客户,这里选择了使用 ROW_NUMBER()。这个 OLAP 函数将所有同姓的客户按照他们的名字来编号。而且,这里决定不使用一个单独的查询来获得总的 COUNT。相反,这里再次使用 OLAP。这需要在用于缓冲所有匹配客户的内存消耗 —— 因为总 COUNT 必须跟在每个客户的后面,但是这个总 COUNT 只有到最后才知道 —— 和从客户表进行两次索引扫描之间作出取舍。对于行数较少并且每行的宽度不大的情况,实际上使用 COUNT(*) OVER() 的 (C_ID, COUNT, NUM) 要好一些。

清单 15 展示了支付事务的计划。

清单 15. 支付事务的访问计划

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

ORDER STATUS 查询

ORDER STATUS 查询的目的是允许客户检索有关他们订单的信息。与支付事务中一样,有的客户记得他们的客户 id,也有一些客户不记得他们的客户 id。下面是假定客户只提供姓氏的情况下的更为复杂的版本:

需要使用 PAYMENT 事务中相同的算法确定客户 ID。

检索客户的全名和帐户余额。

通过选择该客户的最高订单 id,确定最近的订单。

如果订单已发货,则确定送货人的 ID,以及提交订单时的日期。

检索每个订购项的发货日期、数量、总价和发货仓库。

清单 16. 订单状态函数

1
    CREATE FUNCTION ORD_C_LAST(  W_ID INTEGER
2               , D_ID SMALLINT
3               , C_LAST VARCHAR(16)
4              )
5
    RETURNS TABLE(  O_ID     INTEGER
6        , O_CARRIER_ID SMALLINT
7        , O_ENTRY_D  BIGINT
8        , C_BALANCE  BIGINT
9        , C_FIRST   VARCHAR(16)
10        , C_MIDDLE   CHAR(2)
11        , C_ID     INTEGER
12       )
13
    SPECIFIC ORD_C_LAST
14
    READS SQL DATA NO EXTERNAL ACTION DETERMINISTIC LANGUAGE SQL
15 VAR:
    BEGIN ATOMIC
16 
    DECLARE C_BALANCE  BIGINT ;
17 
    DECLARE C_FIRST   VARCHAR(16) ;
18 
    DECLARE C_MIDDLE   CHAR(2) ;
19 
    DECLARE C_ID     INTEGER ;
20 
    DECLARE O_ID     INTEGER;
21 
    DECLARE O_CARRIER_ID SMALLINT;
22 
    DECLARE O_ENTRY_D  BIGINT;
23
24  /* Retrieve the Customer information */
25 
    SET ( C_BALANCE, C_FIRST, C_MIDDLE, C_ID )
26   = (
    SELECT C_BALANCE, C_FIRST, C_MIDDLE , C_ID
27     
    FROM (
    SELECT  C_ID
28             , C_BALANCE
29             , C_FIRST
30             , C_MIDDLE
31             , COUNT(*) OVER() AS COUNT
32             , ROWNUMBER() OVER (ORDER BY C_FIRST)
    AS NUM
33          
    FROM CUSTOMER
34         
    WHERE C_W_ID = ORD_C_LAST.W_ID
35          
    AND C_D_ID = ORD_C_LAST.D_ID
36          
    AND C_LAST = ORD_C_LAST.C_LAST
37        )
    AS V1
38     
    WHERE NUM = (COUNT + 1) / 2
39    )
40  ;
41  /* Take advantage of the index to fetch the first row (and hence max(o_id) ) */
42 
    SET ( O_ID , O_CARRIER_ID , O_ENTRY_D )
43   =  (
    SELECT  O_ID
44          , O_CARRIER_ID
45          , O_ENTRY_D
46       
    FROM ORDERS
47      
    WHERE O_W_ID = ORD_C_LAST.W_ID
48       
    AND O_D_ID = ORD_C_LAST.D_ID
49       
    AND O_C_ID = VAR.C_ID 
50      
    ORDER BY O_ID
    DESC
51      
    FETCH FIRST 1
    ROW ONLY
52     )
53  ;
54 
    RETURN VALUES (  VAR.O_ID
55          , VAR.O_CARRIER_ID
56          , VAR.O_ENTRY_D
57          , VAR.C_BALANCE
58          , VAR.C_FIRST
59          , VAR.C_MIDDLE
60          , VAR.C_ID
61         )
62  ;
63
    END

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

Tags:通过 DB TPC

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