数据库开发设计

一 创建gaussDB 收起

  1. 进入云数据库GaussDB服务,点击左侧的【服务列表】,选择其中【数据库】下的【云数据库GaussDB】。

![|553x244](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps33.jpg)

![|552x292](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps34.jpg)

  1. 进入云数据库GaussDB,点击页面右上角的【购买数据库实例】按钮。

  2. 进入购买页后,根据以下参数信息购买数据库。

主要参数如下,其他请保持默认。

计费模式 :选择【按需计费】

区域和项目 :默认的【华北-北京四】

实例名称 :可以设置为【gauss-hccdp】

产品类型 :基础版

数据库引擎版本 :选择最新版即可

实例类型 :集中式版

部署形态 :1主2备

可用区 :选择默认的可用区一、可用区二、可用区三, 如果这些可用区购买完了,可以自行选择其他可用区。

性能规格 : 选择 “通用型(1:4) | 4 vCPUs | 16 GB”, 如果购买完了 ,选择其他最小的规格即可,如独享型(1:4) | 4 vCPUs | 16 GB。

存储类型、存储空间、磁盘加密 :保持默认

虚拟私有云、内网安全组 :选择已预置的资源vpc-hccdp和subnet-hccdp

安全组 :选择已预置的sg-hccdp

数据库端口 : 使用默认的端口8000

管理员密码 :设置符合安全要求的root用户密码,并记住以便后用,其他选择默认

![|552x235](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps35.jpg)

  1. 确认信息无误后,点击【提交】。

注意:gaussDB实例创建需要20分钟,在数据库创建过程中,可以先继续完成下面的操作。

二 创建表 收起

1 认识TPCC模式E-R图

TPCC压测模型中共包含9张表,分别为bmsql_warehouse、bmsql_stock、bmsql_order_line、bmsql_oorder、bmsql_new_order、bmsql_item、bmsql_history、bmsql_district、bmsql_customer

![|553x390](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps36.png)

2 认识表结构

![|554x421](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps37.jpg)

![|553x501](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps38.jpg)

D_W_ID ForeignKey, references W_ID

![|504x833](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps39.jpg)

(C_W_ID, C_D_ID)Foreign Key, references (D_W_ID, D_ID)

![|498x409](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps40.jpg)

(H_C_W_ID,H_C_D_ID, H_C_ID) Foreign Key, references (C_W_ID, C_D_ID, C_ID)

(H_WID, H_D_ID)Foreign Key, references(D_W_ID, D_ID)

![|505x374](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps41.jpg)

(O_W_ID, O_D_ID,O_C_ID) Foreign Key, references (C_W_ID, C_D_ID, C_ID)

![|502x445](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps42.jpg)

(OL_W_ID,OL_D_ID, OL_O_ID) Foreign Key, references (O_W_ID, O_D_ID, O_ID)

(OL_SUPPLY_W_ID,OL_I_ID) Foreign Key, references ( S_W_ID, S_I_ID)

![|505x248](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps43.jpg)

![|504x670](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps44.jpg)

S_W_ID ForeignKey, references W_ID

S_I_ID ForeignKey, references I_ID

3 登录ECS云服务器

3.1 通过桌面上的Xfce终端登录ECS服务器。

![|553x496](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps45.jpg)

输入以下命令,并将命令中的IP地址替换为ECS弹性公网IP。

ssh root@EIP

注意:EIP地址可进入华为云ECS服务查看:

![|553x188](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps46.jpg)

IP地址信息能够在IP地址列被拷贝:

![|553x194](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps47.jpg)

登录成功后,如图所示:

![|553x223](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps48.jpg)

ECS服务器密码点击眼睛可以获取,如下图所示:

![|553x152](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps49.jpg)

3.2 下载GaussDB链接工具并解压

wget https://dbs-download.obs.cn-north-1.myhuaweicloud.com/GaussDB/1642684986086/GaussDB_opengauss_client_tools.zip

unzip GaussDB_opengauss_client_tools.zip

cd /root/GaussDB_opengauss_client_tools/Euler2.5_X86_64

cp GaussDB-Kernel-V500R001C20-EULER-64bit-gsql.tar.gz /opt

cd /opt/

tar -zxvf GaussDB-Kernel-V500R001C20-EULER-64bit-gsql.tar.gz

![|553x264](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps50.png)

source gsql_env.sh

![|553x45](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps51.jpg)

3.3 使用gsql客户端连接数据库postgres,端口号是默认的8000, 并创建数据库及对应用户,以下命令的<GaussDB主节点的IP>是GaussDB主节点的IP,yourpassword是创建数据库时root用户的密码,请根据实际情况替换。

gsql -h <GaussDB主节点的IP> -d postgres -p 8000 -U root -W yourpassword -r

![|553x54](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps52.jpg)

注意:GaussDB主节点的IP可通过点击GaussDB实例名称,进入信息页面查看:

![|553x197](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps53.jpg)

滑动到节点列表处,就可以看到主节点IP:

![|553x253](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps54.jpg)

3.4 创建一个devdb的库并登录

CREATE DATABASE devdb ENCODING ‘UTF8’ template = template0;

\q

登录到新数据库devdb,是GaussDB主节点的IP,端口号是默认的8000,yourpassword是创建数据库时root用户的密码,请根据实际情况替换:

gsql -h <GaussDB主节点的IP> -d devdb -p 8000 -U root -W yourpassword -r

创建用户hccdp,它具有SYSADMIN权限,yourpassword是自定义的密码,根据要求设置,并记住:

CREATE USER hccdp SYSADMIN IDENTIFIED BY “yourpassword”;

\q

3.5 登录devdb库,<GaussDB主节点的IP>是主节点IP注意根据实际情况更换,端口号是默认的8000,hccdp是用户名,yourpassword是上面设置的密码

gsql -h <GaussDB主节点的IP> -d devdb -p 8000 -U hccdp -W yourpassword -r

4 使用create语句创建表

备注:由于下面的表存在外键关联,需要注意创建的先后顺序,创建时出现NOTICE可忽略。

创建表bmsql_warehouse,并声明w_id为主键:

CREATE TABLE bmsql_warehouse (

w_id integer NOT NULL,

w_ytd numeric(12,2),

w_tax numeric(4,4),

w_name character varying(10),

w_street_1 character varying(20),

w_street_2 character varying(20),

w_city character varying(20),

w_state character(2),

w_zip character(9)

); ALTER TABLE bmsql_warehouse ADD CONSTRAINT bmsql_warehouse_pkey PRIMARY KEY (w_id);

![|552x148](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps55.jpg)

创建表bmsql_district,并声明主键和外键:

CREATE TABLE bmsql_district (

d_w_id integer NOT NULL,

d_id integer NOT NULL,

d_ytd numeric(12,2),

d_tax numeric(4,4),

d_next_o_id integer,

d_name character varying(10),

d_street_1 character varying(20),

d_street_2 character varying(20),

d_city character varying(20),

d_state character(2),

d_zip character(9),

CONSTRAINT d_warehouse_fkey FOREIGN KEY (d_w_id) REFERENCES bmsql_warehouse(w_id)

);

ALTER TABLE bmsql_district ADD CONSTRAINT bmsql_district_pkey PRIMARY KEY (d_w_id, d_id);

![|552x141](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps56.jpg)

创建表bmsql_customer,并声明主键和外键:

CREATE TABLE bmsql_customer (

c_w_id integer NOT NULL,

c_d_id integer NOT NULL,

c_id integer NOT NULL,

c_discount numeric(4,4),

c_credit character(2),

c_last character varying(16),

c_first character varying(16),

c_credit_lim numeric(12,2),

c_balance numeric(12,2),

c_ytd_payment numeric(12,2),

c_payment_cnt integer,

c_delivery_cnt integer,

c_street_1 character varying(20),

c_street_2 character varying(20),

c_city character varying(20),

c_state character(2),

c_zip character(9),

c_phone character(16),

c_since timestamp without time zone,

c_middle character(2),

c_data character varying(500),

CONSTRAINT c_district_fkey FOREIGN KEY (c_w_id, c_d_id) REFERENCES bmsql_district(d_w_id, d_id)

);

ALTER TABLE bmsql_customer ADD CONSTRAINT bmsql_customer_pkey PRIMARY KEY (c_w_id, c_d_id, c_id);

![|554x217](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps57.jpg)

创建表bmsql_history,并声明主键和外键:

CREATE TABLE bmsql_history (

hist_id serial NOT NULL,

h_c_id integer,

h_c_d_id integer,

h_c_w_id integer,

h_d_id integer,

h_w_id integer,

h_date timestamp without time zone,

h_amount numeric(6,2),

h_data character varying(24),

CONSTRAINT h_district_fkey FOREIGN KEY (h_w_id, h_d_id) REFERENCES bmsql_district(d_w_id, d_id),

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 bmsql_history_pkey PRIMARY KEY (hist_id);

![|552x142](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps58.jpg)

创建表bmsql_oorder,并声明主键和外键:

CREATE TABLE bmsql_oorder (

o_w_id integer NOT NULL,

o_d_id integer NOT NULL,

o_id integer NOT NULL,

o_c_id integer,

o_carrier_id integer,

o_ol_cnt integer,

o_all_local integer,

o_entry_d timestamp without time zone,

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_oorder ADD CONSTRAINT bmsql_oorder_pkey PRIMARY KEY (o_w_id, o_d_id, o_id);

![|553x112](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps59.jpg)

创建表bmsql_new_order,并声明主键和外键:

CREATE TABLE bmsql_new_order (

no_w_id integer NOT NULL,

no_d_id integer NOT NULL,

no_o_id integer NOT NULL,

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_new_order ADD CONSTRAINT bmsql_new_order_pkey PRIMARY KEY (no_w_id, no_d_id, no_o_id);

![|553x85](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps60.jpg)

创建表bmsql_item ,并声明主键:

CREATE TABLE bmsql_item (

i_id integer NOT NULL,

i_name character varying(24),

i_price numeric(5,2),

i_data character varying(50),

i_im_id integer

);

ALTER TABLE bmsql_item ADD CONSTRAINT bmsql_item_pkey PRIMARY KEY (i_id);

![|553x104](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps61.jpg)

创建表bmsql_stock ,并声明主键和外键:

CREATE TABLE bmsql_stock (

s_w_id integer NOT NULL,

s_i_id integer NOT NULL,

s_quantity integer,

s_ytd integer,

s_order_cnt integer,

s_remote_cnt integer,

s_data character varying(50),

s_dist_01 character(24),

s_dist_02 character(24),

s_dist_03 character(24),

s_dist_04 character(24),

s_dist_05 character(24),

s_dist_06 character(24),

s_dist_07 character(24),

s_dist_08 character(24),

s_dist_09 character(24),

s_dist_10 character(24),

CONSTRAINT s_item_fkey FOREIGN KEY (s_i_id) REFERENCES bmsql_item(i_id),

CONSTRAINT s_warehouse_fkey FOREIGN KEY (s_w_id) REFERENCES bmsql_warehouse(w_id)

);

ALTER TABLE bmsql_stock ADD CONSTRAINT bmsql_stock_pkey PRIMARY KEY (s_w_id, s_i_id);

![|553x192](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps62.jpg)

创建表bmsql_order_line ,并声明主键和外键:

CREATE TABLE bmsql_order_line (

ol_w_id integer NOT NULL,

ol_d_id integer NOT NULL,

ol_o_id integer NOT NULL,

ol_number integer NOT NULL,

ol_i_id integer NOT NULL,

ol_delivery_d timestamp without time zone,

ol_amount numeric(6,2),

ol_supply_w_id integer,

ol_quantity integer,

ol_dist_info character(24),

CONSTRAINT ol_stock_fkey FOREIGN KEY (ol_supply_w_id, ol_i_id) REFERENCES bmsql_stock(s_w_id, s_i_id),

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 bmsql_order_line_pkey PRIMARY KEY (ol_w_id, ol_d_id, ol_o_id, ol_number);

使用以下命令查看创建的表:

\d

![|553x194](file:///C:\Users\sinochen\AppData\Local\Temp\ksohtml1936\wps63.jpg)

三 下载对应数据文件至/root/tpcc/目录下 收起

1 退出gsql

\q

2 下载对应数据文件至/root/tpcc/目录下

mkdir /root/tpcc/

cd /root/tpcc

wget https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com/gaussdb/tpcc.tar.gz

tar -zxvf tpcc.tar.gz

mv /root/tpcc/home/user/rar/tpcc/bmsql_* .

3 进入gsql

配置gsql环境变量:

cd /opt/source gsql_env.sh

登录devdb库,是主节点IP注意根据实际情况更换,端口号是默认的8000,hccdp是用户名,yourpassword是上面设置的密码:

gsql -h <GaussDB主节点的IP> -d devdb -p 8000 -U hccdp -W yourpassword -r

4 使用\copy命令导入数据

对于bmsql_customer、bmsql_history、bmsql_stock、bmsql_order_line等数据量大的表,数据导入耗时会长些,需耐心等待。

\copy bmsql_warehouse from ‘/root/tpcc/bmsql_warehouse.csv’ with ( FORMAT ‘csv’, DELIMITER ‘,’, ENCODING ‘utf8’);

\copy bmsql_district from ‘/root/tpcc/bmsql_district.csv’ with ( FORMAT ‘csv’, DELIMITER ‘,’, ENCODING ‘utf8’);

\copy bmsql_customer from ‘/root/tpcc/bmsql_customer.csv’ with ( FORMAT ‘csv’, DELIMITER ‘,’, ENCODING ‘utf8’);

\copy bmsql_history from ‘/root/tpcc/bmsql_history.csv’ with ( FORMAT ‘csv’, DELIMITER ‘,’, ENCODING ‘utf8’);

\copy bmsql_oorder from ‘/root/tpcc/bmsql_oorder.csv’ with ( FORMAT ‘csv’, DELIMITER ‘,’, ENCODING ‘utf8’);

\copy bmsql_item from ‘/root/tpcc/bmsql_item.csv’ with ( FORMAT ‘csv’, DELIMITER ‘,’, ENCODING ‘utf8’);

\copy bmsql_new_order from ‘/root/tpcc/bmsql_new_order.csv’ with ( FORMAT ‘csv’, DELIMITER ‘,’, ENCODING ‘utf8’);

\copy bmsql_stock from ‘/root/tpcc/bmsql_stock.csv’ with ( FORMAT ‘csv’, DELIMITER ‘,’, ENCODING ‘utf8’);

\copy bmsql_order_line from ‘/root/tpcc/bmsql_order_line.csv’ with ( FORMAT ‘csv’, DELIMITER ‘,’, ENCODING ‘utf8’);

执行下面的命令去分析每个表:

analyze bmsql_stock;

analyze bmsql_order_line;

analyze bmsql_warehouse;

analyze bmsql_district;

analyze bmsql_customer;

analyze bmsql_history;

analyze bmsql_oorder;

analyze bmsql_new_order;

analyze bmsql_item;

使用以下命令查看对应的表是否导入数据,其中bmsql_customer是当中某个表表名:

SELECT count(*) FROM bmsql_customer;

四 添加约束以及索引 收起

1 添加唯一约束

CREATE UNIQUE INDEX bmsql_oorder_idx1 ON bmsql_oorder USING btree (o_w_id, o_d_id, o_carrier_id, o_id);

2 添加索引

create index bmsql_customer_idx1 on bmsql_customer (c_w_id, c_d_id, c_last, c_first);

通过以下命令查询创建的索引

\di bmsql_customer_idx1

五 SQL查询。 收起

接下来的实验依托TPCC业务逻辑开展,相关SQL语句中的“?”可以替换为前面表中的数据。

1 新建订单

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

以下是新建订单事务中的语句举例:

以仓库id关联客户表和仓库表,查询客户及仓库相关信息:

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 = 1 AND c_d_id = 1 AND c_id = 114;

更新地区表:

SELECT d_tax, d_next_o_id FROM bmsql_district WHERE d_w_id = 1 AND d_id = 1 FOR UPDATE;UPDATE bmsql_district SET d_next_o_id = d_next_o_id + 1 WHERE d_w_id = 1 AND d_id = 1;

在新订单表中插入数据(未发货)

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 (3001, 1, 1, 114,‘2023-02-11 15:00’ , 14, 1);

在订单总表中插入数据

INSERT INTO bmsql_new_order (no_o_id, no_d_id, no_w_id)VALUES (3001, 1, 1);

查看商品库存

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 = 1 AND s_i_id = 1 FOR UPDATE;

更新商品库存信息

UPDATE bmsql_stock SET s_quantity = 90, s_ytd = s_ytd + 4,s_order_cnt = s_order_cnt + 1,s_remote_cnt = s_remote_cnt + 1 WHERE s_w_id = 1 AND s_i_id = 1;

插入订货线数据

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 (3001, 1, 1, 16, 1, 1, 4, 0, ‘j6vO1P7KCKKdP73IcBHkkkRQ’);

2 支付订单

TPCC中,支付订单事务对应的内容为:对于任意一个客户端,从固定的仓库随机选取一个辖区及其内用户,采用随机的金额支付一笔订单,并作相应历史纪录。此类事务在整个TPCC测试用例中占比 : 43%

以下是支付订单事务中的语句举例:

选择一个仓库:

SELECT w_name, w_street_1, w_street_2, w_city, w_state, w_zip FROM bmsql_warehouse WHERE w_id = 1;

选择一个辖区

SELECT d_name, d_street_1, d_street_2, d_city, d_state, d_zip FROM bmsql_district WHERE d_w_id = 1 AND d_id = 1;

根据仓库和辖区信息,选择一个客户

SELECT c_id FROM bmsql_customer WHERE c_w_id = 1 AND c_d_id = 1 AND c_last = ‘BARBARPRI’ 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 = 1 AND c_d_id = 1 AND c_id = 4 FOR UPDATE;SELECT c_data FROM bmsql_customer WHERE c_w_id = 1 AND c_d_id = 1 AND c_id = 4;

采用随机的金额支付一笔订单,更新客户表、辖区表、仓库表数据

UPDATE bmsql_warehouse SET w_ytd = w_ytd + 3 WHERE w_id = 1;UPDATE bmsql_district SET d_ytd = d_ytd + 3 WHERE d_w_id = 1 AND d_id = 1;UPDATE bmsql_customer SET c_balance = c_balance - 50, c_ytd_payment = c_ytd_payment + 50 ,c_payment_cnt = c_payment_cnt + 1 WHERE c_w_id = 1 AND c_d_id = 1 AND c_id = 4;

记录该笔支付至历史表:

INSERT INTO bmsql_history(hist_id,h_c_id, h_c_d_id, h_c_w_id, h_d_id, h_w_id,h_date, h_amount, h_data)VALUES(300001,4, 1, 1, 1, 1, ‘2023-02-11’, 50, ‘succeed’);

3 查询订单状态

TPCC中,查询订单状态事务对应的内容为:对于任意一个客户端,从固定的仓库随机选取一个辖区及其内用户,读取其最后一条订单,显示订单内每件商品的状态,此类事务在整个TPCC测试用例中占比 : 4%。

以下是查询订单状态事务中的语句举例:

选择一个客户

SELECT c_id FROM bmsql_customer WHERE c_w_id = 1 AND c_d_id = 2 AND c_last = ‘BAROUGHTPRES’ ORDER BY c_first ;

查看该客户的相关信息

SELECT c_first, c_middle, c_last, c_balance FROM bmsql_customer WHERE c_w_id = 1 AND c_d_id = 2 AND c_id = 15;

查看该客户的最新一条订单信息

SELECT o_id, o_entry_d, o_carrier_id FROM bmsql_oorder WHERE o_w_id = 1 AND o_d_id = 2 AND o_c_id = 15 AND o_id = (SELECT max(o_id) FROM bmsql_oorder WHERE o_w_id = 1 AND o_d_id = 2 AND o_c_id = 15);

查看订货线中该客户的最新订单的商品状态

SELECT ol_i_id, ol_supply_w_id, ol_quantity,ol_amount, ol_delivery_d FROM bmsql_order_line WHERE ol_w_id = 1 AND ol_d_id = 2 AND ol_o_id = 1229 ORDER BY ol_w_id, ol_d_id, ol_o_id, ol_number;

4 发货

TPCC中,发货事务对应的内容为:对于任意一个客户端,随机选取一个发货包,更新被处理订单的用户余额,并把该订单从新订单中删除。此类事务在整个TPCC测试用例中占比 : 4%。

以下是发货事务中的语句举例:

选择一个发货包

SELECT min(no_o_id) FROM bmsql_new_order WHERE no_w_id = 2 AND no_d_id = 2 ;

在新订单中删除该发货包数据

DELETE FROM bmsql_new_order WHERE no_w_id = 2 AND no_d_id = 2 AND no_o_id = 2101;

获取该发货包的客户

SELECT o_c_id FROM bmsql_oorder WHERE o_w_id =2 AND o_d_id = 2 AND o_id = 2101;

更新订单总表中信息

UPDATE bmsql_oorder SET o_carrier_id = 1 WHERE o_w_id = 2 AND o_d_id = 2 AND o_id = 2101;

计算该发货包的订单金额

SELECT sum(ol_amount) AS sum_ol_amount FROM bmsql_order_line WHERE ol_w_id = 2 AND ol_d_id = 2 AND ol_o_id = 2101;

更新订货线中发货状态

UPDATE bmsql_order_line SET ol_delivery_d = ‘2023-2-11’ WHERE ol_w_id = 2 AND ol_d_id = 2 AND ol_o_id = 2101;

根据订单金额,更新用户余额

UPDATE bmsql_customer SET c_balance = c_balance + 31547.84, c_delivery_cnt = c_delivery_cnt + 1 WHERE c_w_id = 2 AND c_d_id = 2 AND c_id = 2855;

5 查询库存

TPCC中,查询库存事务对应的内容为:对于任意一个客户端,从固定的仓库和辖区随机选取最后 20 条订单,查看订单中所有的货物的库存,计算并显示所有库存低于随机生成域值的商品数量。此类事务在整个TPCC测试用例中占比 : 4%。

以下是查询库存事务中的语句举例:

选择一个辖区和仓库,并定义一个阈值,按上述要求查看库存

SELECT count(*) AS low_stock FROM ( SELECT s_w_id, s_i_id, s_quantity FROM bmsql_stock WHERE s_w_id = 1 AND s_quantity < 60 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 = 1 AND d_id = 1));

------恭喜您完成本实验------