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
查询库存,过滤掉重复商品代码