tpcc模型介绍

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

表定义

WAREHOUSE

DISTRICT

CUSTOMER

HISTORY

NEW_ORDER

ORDER

ORDER_LINE

ITEM

STOCK

表的关系

业务

  1. New-Order: 45%
  2. Payment:43%
  3. Delivery:4%
  4. Order-Status:4%
  5. Stock-Level:4%

新订单(New-Order)

在一个事务中输入一张完整定单。它是中重量级的读写事务,发生频率高, 要求响应时间短。

输入:

1
2
3
4
5
6
7
仓库代码(W_ID)
地区代码(D_W_ID,D_ID)
客户代码 (C_W_ID,C_D_ID_,C_ID)
分录数(OL_CNT)
各分录对应的商品代码(OL_I_ID)
供货仓库代码(OL_SUPPLY_W_ID)
数量 (OL_QUANTITY)

事务逻辑

  1. 根据W_ID查询WAREHOUSE, 得到税率W_TAX
  2. 根据D_W_ID, D_ID查询DISTRICT, 取税率D_TAX, 同时取D_NEXT_O_ID并对其加一
  3. 根据C_W_ID,C_D_ID, C_ID查询CUSTOMER表,取客户折扣率C_DISCOUNT, 姓C_LAST,信用C_CREDIT
  4. NEW_ORDERORDER表中插入订单信息。O_CARRIER_ID置空,如果订单中的商品均在本地仓库,O_ALL_LOCAL设置为1,否则设置为0。
  5. 对每笔分录
    • 根据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赋值。
  6. 计算定单总价格 H_AMOUNT = SUM(OL_AMOUNT)*(1- C_DISCOUNT)*(1+W_TAX+D_TAX)

涉及到的修改操作

  1. DISTRICT表对字段D_NEXT_O_ID进行自增, 属于热点更新,每个订单都要更新此数据
  2. NEW_ORDERORDER表各插入一行数据,无热点
  3. 对每笔分录,需要修改对应STOCK的库存,基本无热点
  4. 对每笔分录,进行插入,无热点

主要是第一个热点更新是性能瓶颈。

付款(Payment)

在一个事务中更新客户余额、地区、仓库的销售数据。它是轻重量级的读写事 务,发生频率高,要求响应时间短。另外,此事务中有不按关键字访问 CUSTOMER 的情况。

输入

1
输入仓库代码(W_ID),地区代码(D_W_ID,D_ID),客户代码 (C_W_ID,C_D_ID,C_ID)或者客户姓氏 (C_W_ID,C_D_ID,C_LAST),支付金额(H_AMOUNT)

事务逻辑

  1. 根据W_ID,更新WAREHOUSE表,W_YTD = W_YTD + H_AMOUNT
  2. 根据D_W_ID,D_ID,更新DISTRICT, D_YTD = D_YTD + H_AMOUNT
  3. 两种情况
    • 根据客户代码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

    • 根据客户姓氏查找, 后续一致。

  4. 如果客户的C_CREDITBC,表示信用差,需要修改C_DATA = C_W_ID,C_D_ID,C_ID,D_ID,D_ID,W_ID + C_DATA
  5. 修改HISTORY表,H_DATA= W_NAME+D_NAME+H_DATA

涉及到的修改操作

  1. 更新WAREHOUSE的W_YTD字段,每个订单更新一次,热点更新
  2. 更新DISTRICT的D_YTD字段,每个订单更新一次,热点更新
  3. 修改客户的欠款余额等信息,无热点
  4. 修改HISTORY表,无热点

1和2热点更新严重

查询定单(Order-Status)

显示指定客户最近的定单状态。它是中重量级的只读事务,发生频率高。另 外,此事务中有不按关键字访问 CUSTOMER 的情况。

输入

1
输入客户代码(C_W_ID,C_D_ID,C_ID)或客户姓氏 (C_W_ID,C_D_ID,C_LAST)

事务逻辑

  1. 根据C_W_ID,C_D_ID,C_ID查询CUSTOMER表,获取用户C_FIRST,C_MIDDLE,C_LAST, C_BALANCE
  2. 根据O_W_ID = C_W_ID AND O_D_ID = O_D_ID AND O_D_ID = O_D_ID查询定单表,取O_ID最大的这行数据
  3. 根据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 个),发生频率低,响应时间要求低

输入

1
2
3
输入仓库(W_ID)
对其下属地区(D_W_ID,D_ID)
和指定的运输代码(O_CARRIER_ID)

事务逻辑

  1. 根据NO_W_ID = W_ID and NO_W_ID = W_IDNEW_ORDER表中查询最小的订单号NO_O_ID的订单,如不存在新订单,则略过
  2. NEW_ORDER中删除记录
  3. 根据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
  4. 根据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
  5. 修改CUSTOMER表,C_BALANCE = C_BALANCE + OL_AMOUNT, 累计发货数量加一C_DELIVERY_CNT + 1

涉及到的修改操作

  1. NEW_ORDER表进行删除操作,无热点
  2. 更新ORDER表, 无热点
  3. 更新ORDER_LINE表, 无热点
  4. 更新CUSTOMER表,无热点

库存报警(Stock-Level)

找出最近销售的哪些商品库存低于指定限值。是重量级的只读事务,发生频
率低,响应时间要求低。

输入

1
输入仓库代码(W_ID)、地区代码(D_W_ID,D_ID)、限值

事务逻辑

  1. 根据W_ID, D_ID,查询DISTRICT,获取下一订单号D_NEXT_O_ID
  2. 根据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 笔商品
  3. 根据S_I_ID = OL_I_ID and S_W_ID = W_ID and S_QUANTITY < limit 查询库存,过滤掉重复商品代码

本文标题:tpcc模型介绍

文章作者:Louis

发布时间:2017年11月14日 - 11:11

最后更新:2017年11月14日 - 14:11

原始链接:/2017/11/14/tpcc/

许可协议: Louis-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。