TPC-C是事务测试标准,数据库性能唯一官方指标。TPC-C模拟商品库存,交易,支付等过程,相比之下,sysbench就是个玩具。
表定义
WAREHOUSE

DISTRICT

CUSTOMER

HISTORY

NEW_ORDER

ORDER

ORDER_LINE

ITEM

STOCK

表的关系

业务
- New-Order: 45%
 - Payment:43%
 - Delivery:4%
 - Order-Status:4%
 - Stock-Level:4%
 
新订单(New-Order)
在一个事务中输入一张完整定单。它是中重量级的读写事务,发生频率高, 要求响应时间短。
输入:
  | 
  | 
事务逻辑
- 根据
W_ID查询WAREHOUSE, 得到税率W_TAX - 根据
D_W_ID,D_ID查询DISTRICT, 取税率D_TAX, 同时取D_NEXT_O_ID,并对其加一。 - 根据
C_W_ID,C_D_ID,C_ID查询CUSTOMER表,取客户折扣率C_DISCOUNT, 姓C_LAST,信用C_CREDIT - 在
NEW_ORDER和ORDER表中插入订单信息。O_CARRIER_ID置空,如果订单中的商品均在本地仓库,O_ALL_LOCAL设置为1,否则设置为0。 - 对每笔分录
- 根据
I_ID, 查询ITEM表,取价格I_PRICE、名称I_NAME、备注I_DATA;如果商品代码不存在,报错并回滚事务. - 根据
S_W_ID = OL_SUPPLY_W_ID AND S_I_ID=OL_I_ID,查询STOCK表, 取库存S_QUANTITY、地区说明S_DIST_xx,xx 为地区代码、备注S_DATA, 库存量减去商品数量,S_QUANTITY = S_QUANTITY - OL_QUANTITY, 累计供货数量加上商品数量S_YTD = S_YTD + OL_QUANTITY, 累计定单数量加一S_ORDER_CNT=S_ORDER_CNT+1, 如果分录中的商品在其他仓库,则累计其他仓库供货数量加一S_REMOTE_CNT=S_REMOTE_CNT+1 - 计算价格
OL_AMOUNT = OL_QUANTITY * I_PRICE - 插入分录数据, 供货时间
OL_DELIVERY_D置空; 分录号OL_NUMBER赋值;地区信息OL_DIST_INFO赋值 为S_DIST_xx,OL_AMOUNT赋值。 
 - 根据
 - 计算定单总价格 
H_AMOUNT = SUM(OL_AMOUNT)*(1- C_DISCOUNT)*(1+W_TAX+D_TAX) 
涉及到的修改操作
DISTRICT表对字段D_NEXT_O_ID进行自增, 属于热点更新,每个订单都要更新此数据NEW_ORDER和ORDER表各插入一行数据,无热点- 对每笔分录,需要修改对应
STOCK的库存,基本无热点 - 对每笔分录,进行插入,无热点
 
主要是第一个热点更新是性能瓶颈。
付款(Payment)
在一个事务中更新客户余额、地区、仓库的销售数据。它是轻重量级的读写事 务,发生频率高,要求响应时间短。另外,此事务中有不按关键字访问 CUSTOMER 的情况。
输入
  | 
  | 
事务逻辑
- 根据
W_ID,更新WAREHOUSE表,W_YTD = W_YTD + H_AMOUNT - 根据
D_W_ID,D_ID,更新DISTRICT,D_YTD = D_YTD + H_AMOUNT - 两种情况
- 
根据客户代码
C_W_ID,C_D_ID,C_ID,查找CUSTOMER表, 修改欠款余额,C_C_BALANCE=C_BALANCE-H_AMOUNT, 累计支付金额加上支付金额C_YTD_PAYMENT=C_YTD_PAYMENT+ H_AMOUNT,支付次数加一C_PAYMENT_CNT= C_PAYMENT_CNT + 1 - 
根据客户姓氏查找, 后续一致。
 
 - 
 - 如果客户的
C_CREDIT为BC,表示信用差,需要修改C_DATA = C_W_ID,C_D_ID,C_ID,D_ID,D_ID,W_ID + C_DATA - 修改HISTORY表,
H_DATA= W_NAME+D_NAME+H_DATA 
涉及到的修改操作
- 更新WAREHOUSE的
W_YTD字段,每个订单更新一次,热点更新 - 更新DISTRICT的
D_YTD字段,每个订单更新一次,热点更新 - 修改客户的欠款余额等信息,无热点
 - 修改HISTORY表,无热点
 
1和2热点更新严重
查询定单(Order-Status)
显示指定客户最近的定单状态。它是中重量级的只读事务,发生频率高。另 外,此事务中有不按关键字访问 CUSTOMER 的情况。
输入
  | 
  | 
事务逻辑
- 根据
C_W_ID,C_D_ID,C_ID查询CUSTOMER表,获取用户C_FIRST,C_MIDDLE,C_LAST, C_BALANCE - 根据
O_W_ID = C_W_ID AND O_D_ID = O_D_ID AND O_D_ID = O_D_ID查询定单表,取O_ID最大的这行数据 - 根据
O_W_ID = C_W_ID AND O_D_ID = O_D_ID AND O_ID = OL_O_ID查询订单分录表,记录按照OL_I_ID排序,获取OL_SUPPLY_W_ID, OL_QUANTITY, OL_QUANTITY,OL_DELIVERY_D 
发货(Delivery)
以10笔新订单(NEW_ORDER,未发货订单)为一批处理,一张订单的处 理必须在一个读写型事务中完成。至于一个数据库事务中只处理一张订单还是处 理多张订单,在实现时可以根据情况调整。一笔业务处理包括一个或多个数据库 事务(最多 10 个),发生频率低,响应时间要求低
输入
  | 
  | 
事务逻辑
- 根据
NO_W_ID = W_ID and NO_W_ID = W_ID在NEW_ORDER表中查询最小的订单号NO_O_ID的订单,如不存在新订单,则略过 - 在
NEW_ORDER中删除记录 - 根据
O_W_ID = W_ID and O_D_ID = D_ID and O_O_ID = NO_O_ID, 查询ORDER表,取O_C_ID,更新O_CARRIER_ID - 根据
OL_W_ID = O_W_ID and OL_D_ID = O_D_ID and OL_O_ID = O_O_ID查询ORDER_LINE表,更新发货时间OL_DELIVERY_D为当前时间,记录OL_AMOUNT - 修改CUSTOMER表,
C_BALANCE = C_BALANCE + OL_AMOUNT, 累计发货数量加一C_DELIVERY_CNT + 1 
涉及到的修改操作
- 对
NEW_ORDER表进行删除操作,无热点 - 更新ORDER表, 无热点
 - 更新
ORDER_LINE表, 无热点 - 更新
CUSTOMER表,无热点 
库存报警(Stock-Level)
找出最近销售的哪些商品库存低于指定限值。是重量级的只读事务,发生频
率低,响应时间要求低。
输入
  | 
  | 
事务逻辑
- 根据
W_ID, D_ID,查询DISTRICT,获取下一订单号D_NEXT_O_ID - 根据
OL_W_ID = W_ID and OL_D_ID = D_ID and D_NEXT_O_ID-20 <= OL_O_ID < D_NEXT_O_ID查询ORDER_LINE表,查询结果为最近销售的 20 笔商品 - 根据
S_I_ID = OL_I_ID and S_W_ID = W_ID and S_QUANTITY < limit查询库存,过滤掉重复商品代码