通过DB2 TPC-C基准实现探索SQL
2009-12-23 15:00:09 来源:WEB开发网NEW ORDER 事务(本地)
NEW ORDER 事务处理来自一个客户的新订单。这里需要做各种不同的事情:
获取下一个订单 id 和客户所在地区的地区税率。
增加客户所在地区的下一个订单 id,以便用于随后的事务。
对于客户订购的每种产品:
从 ITEM 表检索产品的名称、价格和描述。
从 STOCK 表检索该产品的地区信息和剩下的库存水平。
将该产品的库存水平减去订购的数量。如果库存低于阈值,则应该订购货物(通过简单地增加库存值来实现)。
将获得的相关数据,包括总价格,插入到 ORDER_LINE 中。
将订单插入 ORDERS 和 NEW_ORDER 表。
从 CUSTOMER 检索客户名、折扣、信用信息。
从 WAREHOUSE 检索销售税。
考虑折扣和税,计算总价格。
这是很大的工作量。不过,DB2 使用 SQL 语句来处理所有这些工作。其原理如下:
首先,DB2 处理 DISTRICT 表。这里需要返回数据,并执行更新。经验告诉我们,这需要 2 条 SQL 语句,并且 UPDATE 应该在 SELECT 语句之前执行;否则,当并发增多时,可能会发生死锁。
但是,DB2 支持一种新的 SQL 特性,这种特性正处在标准化的过程中。该特性允许访问触发器中所谓的 过渡表(transition table)。 OLD TABLE 过渡表保存了受影响的行在被 UPDATE 或 DELETE 语句处理之前的初始状态。 NEW TABLE 过渡表保存处理了 INSERT 或 UPDATE 语句之后受影响的行。这是 AFTER 触发器被激发之前的状态。懂得 Microsoft 或 Sybase 的用户可能知道这两个表,在 Microsoft 或 Sybase 中,这两个表的表名是 DELETED 和 INSERTED。
DB2 所做的就是允许 UPDATE、DELETE 和 INSERT 出现在选择语句的 FROM 子句中,并允许用户选择应该从哪个过渡表进行选择:
清单 2. 使用过渡表
1
SELECT D_TAX, D_NEXT_O_ID
2
INTO :dist_tax , :next_o_iD
3
FROM OLD TABLE (
UPDATE DISTRICT
4
SET D_NEXT_O_ID = D_NEXT_O_ID + 1
5
WHERE D_W_ID = :w_iD
6
AND D_ID = :d_iD
7 )
AS OT
通过查看 清单 3 中所示的优化器计划,可以很容易看出这种逻辑的优点:
清单 3. 使用过渡表的访问计划
Rows
RETURN
( 1)
CosT
I/O
|
1
UPDATE
( 2)
25.7261
2
/---+--
1 26
FETCH TABLE: SRIELAU
( 3) DISTRICT
12.872
1
/----+---
1 26
IXSCAN TABLE: SRIELAU
( 4) DISTRICT
0.0175755
0
|
26
INDEX: SYSIBM
SQL0410231029415
更多精彩
赞助商链接