• TPCC测试


    建表

    warehouse

    int decimal(12,2) decimal(4,4) varchar(10) varchar(20) varchar(20) varchar(20) char(2) char(9)
    w_id w_ytd w_tax w_name w_street_1 w_street_2 w_city w_state w_zip

    district

    int int decimal(12,2) decimal(4,4) integer varchar(10) varchar(20) varchar(20) varchar(20) char(2) char(9)
    d_w_id d_id d_ytd d_tax d_next_o_id d_name d_street_1 d_street_1 d_city d_state d_zip

    customer

    int int int decimal(4,4) char(2) varchar(16) varchar(16) decimal(12,2) decimal(12,2) decimal(12,2) int int varchar(20) varchar(20) varchar(20) char(2) char(9) char(16) timestamp char(2) varchar(500)
    c_w_id c_d_id c_id c_discount c_credit c_last c_first c_credit_lim c_balance c_ytd_payment c_payment_cnt c_delivery_cnt c_street_1 c_street_2 c_city c_state c_zip c_phone c_since c_middle c_data

    history

    int int int int int int timestamp decimal(6,2) varchar(24)
    hist_id h_c_id h_c_d_id h_c_w_id h_d_id h_w_id h_data h_amount h_data

    new_order

    int int int
    no_w_id no_d_id no_o_id

    oorder

    int int int int int int int timestamp
    o_w_id o_d_id o_id o_c_id o_carrier_id o_ol_cnt o_all_local o_entry_d

    order_line

    int int int int int timestamp decimal(6,2) int int char(24)
    ol_w_id ol_d_id ol_o_id ol_number ol_i_id ol_deliver_d ol_amount ol_supply_w_id ol_quantity ol_dist_info

    stock

    int int int int int int varchar(50) char(24) char(24) char(24) char(24) char(24) char(24) char(24) char(24) char(24) char(24)
    s_w_id s_i_id s_quantity s_ytd s_order_cnt s_remote_cnt s_data s_dist_01 s_dist_02 s_dist_03 s_dist_04 s_dist_05 s_dist_06 s_dist_07 s_dist_08 s_dist_09 s_dist_10

    索引

    10个唯一索引、主键、联合唯一、联合主键

    alter table bmsql_warehouse add constraint bmsql_warehouse_pkey primary key (w_id);  
    alter table bmsql_district add constraint bmsql_district_pkey primary key (d_w_id, d_id);   
    alter table bmsql_customer add constraint bmsql_customer_pkey  primary key (c_w_id, c_d_id, c_id);   
    create index bmsql_customer_idx1 on  bmsql_customer (c_w_id, c_d_id, c_last, c_first);   
    alter table bmsql_oorder add constraint bmsql_oorder_pkey  primary key (o_w_id, o_d_id, o_id);   
    create unique index bmsql_oorder_idx1  on  bmsql_oorder (o_w_id, o_d_id, o_carrier_id, o_id);  
    alter table bmsql_new_order add constraint bmsql_new_order_pkey  primary key (no_w_id, no_d_id, no_o_id);  
    alter table bmsql_order_line add constraint bmsql_order_line_pkey  primary key (ol_w_id, ol_d_id, ol_o_id, ol_number);  
    alter table bmsql_stock add constraint bmsql_stock_pkey  primary key (s_w_id, s_i_id);  
    alter table bmsql_item add constraint bmsql_item_pkey  primary key (i_id);  
    

    外键

    10个外键约束

    alter table bmsql_district add constraint d_warehouse_fkey  foreign key (d_w_id)  references bmsql_warehouse (w_id);  
    alter table bmsql_customer add constraint c_district_fkey   foreign key (c_w_id, c_d_id)    references bmsql_district (d_w_id, d_id);  
    alter table bmsql_history add constraint h_customer_fkey  foreign key (h_c_w_id, h_c_d_id, h_c_id)   references bmsql_customer (c_w_id, c_d_id, c_id);  
    alter table bmsql_history add constraint h_district_fkey  foreign key (h_w_id, h_d_id)  references bmsql_district (d_w_id, d_id);  
    alter table bmsql_new_order add constraint no_order_fkey   foreign key (no_w_id, no_d_id, no_o_id)   references bmsql_oorder (o_w_id, o_d_id, o_id);  
    alter table bmsql_oorder add constraint o_customer_fkey  foreign key (o_w_id, o_d_id, o_c_id)   references bmsql_customer (c_w_id, c_d_id, c_id);  
    alter table bmsql_order_line add constraint ol_order_fkey  foreign key (ol_w_id, ol_d_id, ol_o_id)   references bmsql_oorder (o_w_id, o_d_id, o_id); 
    alter table bmsql_order_line add constraint ol_stock_fkey foreign key (ol_supply_w_id, ol_i_id)  references bmsql_stock (s_w_id, s_i_id);  
    alter table bmsql_stock add constraint s_warehouse_fkey  foreign key (s_w_id) references bmsql_warehouse (w_id);  
    alter table bmsql_stock add constraint s_item_fkey  foreign key (s_i_id)   references bmsql_item (i_id);  
    

    业务逻辑

    新建订单

    事务内容:对于任意一个客户端,从固定的仓库随机选取 5-15 件商品,创建新订单.其中 1%的订单要由假想的用户操作失败而回滚。 占比 : 45%

    SELECT c_discount, c_last, c_credit, w_tax FROM bmsql_customer JOIN bmsql_warehouse ON (w_id = c_w_id) WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?
    SELECT d_tax, d_next_o_id FROM bmsql_district WHERE d_w_id = ? AND d_id = ? FOR UPDATE
    UPDATE bmsql_district SET d_next_o_id = d_next_o_id + 1 WHERE d_w_id = ? AND d_id = ?
    INSERT INTO bmsql_oorder (o_id, o_d_id, o_w_id, o_c_id, o_entry_d,o_ol_cnt, o_all_local)VALUES (?, ?, ?, ?, ?, ?, ?)
    INSERT INTO bmsql_new_order (no_o_id, no_d_id, no_w_id)VALUES (?, ?, ?)
    SELECT s_quantity, s_data,s_dist_01, s_dist_02, s_dist_03, s_dist_04,s_dist_05, s_dist_06, s_dist_07, s_dist_08,s_dist_09, s_dist_10 FROM bmsql_stock WHERE s_w_id = ? AND s_i_id = ? FOR UPDATE
    SELECT i_price, i_name, i_data FROM bmsql_item WHERE i_id = ?
    UPDATE bmsql_stock SET s_quantity = ?, s_ytd = s_ytd + ?,s_order_cnt = s_order_cnt + 1,s_remote_cnt = s_remote_cnt + ? WHERE s_w_id = ? AND s_i_id = ?
    INSERT INTO bmsql_order_line (ol_o_id, ol_d_id, ol_w_id, ol_number,ol_i_id, ol_supply_w_id, ol_quantity,ol_amount, ol_dist_info)VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
    

    支付订单

    对于任意一个客户端,从固定的仓库随机选取一个辖区及其内用户,采用随机的金额支付一笔订单,并作相应历史纪录 占比 : 43%

    SELECT w_name, w_street_1, w_street_2, w_city,  w_state, w_zip FROM bmsql_warehouse WHERE w_id = ?
    SELECT d_name, d_street_1, d_street_2, d_city, d_state, d_zip FROM bmsql_district WHERE d_w_id = ? AND d_id = ?
    SELECT c_id FROM bmsql_customer WHERE c_w_id = ? AND c_d_id = ? AND c_last = ? ORDER BY c_first
    SELECT c_first, c_middle, c_last, c_street_1, c_street_2,c_city, c_state, c_zip, c_phone, c_since, c_credit, c_credit_lim, c_discount, c_balance FROM bmsql_customer WHERE c_w_id = ? AND c_d_id = ? AND c_id = ? FOR UPDATE
    SELECT c_data FROM bmsql_customer WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?
    UPDATE bmsql_warehouse SET w_ytd = w_ytd + ? WHERE w_id = ?
    UPDATE bmsql_district SET d_ytd = d_ytd + ? WHERE d_w_id = ? AND d_id = ?
    UPDATE bmsql_customer SET c_balance = c_balance - ?, c_ytd_payment = c_ytd_payment + ? c_payment_cnt = c_payment_cnt + 1 WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?
    UPDATE bmsql_customer SET c_balance = c_balance - ?,c_ytd_payment = c_ytd_payment + ?,c_payment_cnt = c_payment_cnt + 1,c_data = ? WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?
    INSERT INTO bmsql_history (h_c_id, h_c_d_id, h_c_w_id, h_d_id, h_w_id,h_date, h_amount, h_data)VALUES (?, ?, ?, ?, ?, ?, ?, ?)
    

    查询订单状态

    对于任意一个客户端,从固定的仓库随机选取一个辖区及其内用户,读取其最后一条订单,显示订单内每件商品的状态. 占比 : 4%

    SELECT c_id FROM bmsql_customer WHERE c_w_id = ? AND c_d_id = ? AND c_last = ? ORDER BY c_first
    SELECT c_first, c_middle, c_last, c_balance FROM bmsql_customer WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?
    SELECT o_id, o_entry_d, o_carrier_id FROM bmsql_oorder WHERE o_w_id = ? AND o_d_id = ? AND o_c_id = ? AND o_id = (SELECT max(o_id) FROM bmsql_oorder WHERE o_w_id = ? AND o_d_id = ? AND o_c_id = ?    
    SELECT ol_i_id, ol_supply_w_id, ol_quantity,ol_amount, ol_delivery_d FROM bmsql_order_line WHERE ol_w_id = ? AND ol_d_id = ? AND ol_o_id = ? ORDER BY ol_w_id, ol_d_id, ol_o_id, ol_number
    

    发货

    对于任意一个客户端,随机选取一个发货包,更新被处理订单的用户余额,并把该订单从新订单中删除. 占比 : 4%

    SELECT count(*) AS low_stock FROM (	SELECT s_w_id, s_i_id, s_quantity  FROM bmsql_stock WHERE s_w_id = ? AND s_quantity < ? AND s_i_id IN ( SELECT ol_i_id FROM bmsql_district JOIN bmsql_order_line ON ol_w_id = d_w_id AND ol_d_id = d_id AND ol_o_id >= d_next_o_id - 20 AND ol_o_id < d_next_o_id WHERE d_w_id = ? AND d_id = ?
    

    查询库存

    对于任意一个客户端,从固定的仓库和辖区随机选取最后 20 条订单,查看订单中所有的货物的库存,计算并显示所有库存低于随机生成域值的商品数量. 占比 : 4%

    SELECT no_o_id FROM bmsql_new_order WHERE no_w_id = ? AND no_d_id = ?  ORDER BY no_o_id ASC
    DELETE FROM bmsql_new_order WHERE no_w_id = ? AND no_d_id = ? AND no_o_id = ?
    SELECT o_c_id FROM bmsql_oorder WHERE o_w_id = ? AND o_d_id = ? AND o_id = ?
    UPDATE bmsql_oorder  SET o_carrier_id = ? WHERE o_w_id = ? AND o_d_id = ? AND o_id = ?
    SELECT sum(ol_amount) AS sum_ol_amount FROM bmsql_order_line WHERE ol_w_id = ? AND ol_d_id = ? AND ol_o_id = ?
    UPDATE bmsql_order_line SET ol_delivery_d = ? WHERE ol_w_id = ? AND ol_d_id = ? AND ol_o_id = ?
    UPDATE bmsql_customer SET c_balance = c_balance + ?, c_delivery_cnt = c_delivery_cnt + 1 WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?
    

    常用工具

     benchmarksql
     tpcc-mysql
    本文原创自博客园 地址:https://www.cnblogs.com/Heoric/
    我想要知道上帝是如何创造这个世界的。我对这个或那个现象不感兴趣,我要知道的是他的思想。其他都是细节。
  • 相关阅读:
    网页自动跳转/定时跳转代码
    阿里云ECS用Xshell安装wdcp教程
    wdcp环境下更新PHP到5.3教程
    WDCP 安装教程,超简单!!
    Jquery select 三级联动 (需要JSON数据)
    Jquery实现循环删除Reaper某一行
    jquery更改Reaper某一列的值
    联系电话正则表达式(jquery表单验证)
    Jquery获取选中的checkbox的值
    sql语句创建主键、外键、索引、绑定默认值
  • 原文地址:https://www.cnblogs.com/Heoric/p/13924662.html
Copyright © 2020-2023  润新知