通过 DB2 TPC-C 基准实现探索 SQL(2)
2008-09-17 16:31:45 来源:WEB开发网为了发现中间的客户,这里选择了使用 ROW_NUMBER()。这个 OLAP 函数将所有同姓的客户按照他们的名字来编号。而且,这里决定不使用一个单独的查询来获得总的 COUNT。相反,这里再次使用 OLAP。这需要在用于缓冲所有匹配客户的内存消耗 —— 因为总 COUNT 必须跟在每个客户的后面,但是这个总 COUNT 只有到最后才知道 —— 和从客户表进行两次索引扫描之间作出取舍。对于行数较少并且每行的宽度不大的情况,实际上使用 COUNT(*) OVER() 的 (C_ID, COUNT, NUM) 要好一些。
清单 15 展示了支付事务的计划。
清单 15. 支付事务的访问计划
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
更多精彩
赞助商链接