本文介绍AnalyticDB PostgreSQL版Serverless模式实例批量DELETE和UPDATE的性能。
测试实例
创建AnalyticDB PostgreSQL版实例的具体操作,请参见创建实例。
实例规格信息如下:
- Serverless模式实例
- Segment节点规格:4C16G
- Segment节点数量:4个
- 存储弹性模式实例
- Segment节点规格:2C16G
- Segment节点数量:4个
测试数据
生成并导入测试数据的具体操作,请参见TPC-H。
测试数据具体信息如下:
- 测试数据量:100 GB。
- 测试数据表:lineitem、orders。
lineitem建表语法如下:
CREATE TABLE lineitem ( l_orderkey bigint NOT NULL, l_partkey integer NOT NULL, l_suppkey integer NOT NULL, l_linenumber integer NOT NULL, l_quantity numeric(15,2) NOT NULL, l_extendedprice numeric(15,2) NOT NULL, l_discount numeric(15,2) NOT NULL, l_tax numeric(15,2) NOT NULL, l_returnflag character(1) NOT NULL, l_linestatus character(1) NOT NULL, l_shipdate date NOT NULL, l_commitdate date NOT NULL, l_receiptdate date NOT NULL, l_shipinstruct character(25) NOT NULL, l_shipmode char(10) NOT NULL, l_comment varchar(44) NOT NULL ) distributed by (l_orderkey) order by (l_shipdate,l_orderkey);
orders建表语法如下:
CREATE TABLE orders ( o_orderkey bigint NOT NULL, o_custkey integer NOT NULL, o_orderstatus character(1) NOT NULL, o_totalprice numeric(15,2) NOT NULL, o_orderdate date NOT NULL, o_orderpriority character(15) NOT NULL, o_clerk character(15) NOT NULL, o_shippriority integer NOT NULL, o_comment character varying(79) NOT NULL ) distributed by (o_orderkey) order by (o_orderdate, o_orderkey);
- 测试数据行数:lineitem表6亿行,orders表1.5亿行,合计7.5亿行。
lineitem和orders表均根据时间列按天均匀分布数据,lineitem表每天约有25万行数据;orders表每天约有6万行数据。因此示例语句中的时间范围可以决定查询的数据量,本次性能测试的时间范围和数据量如下:
- 一天,约有31万行数据。
- 半个月,约有466万行数据。
- 一个月,约有965万行数据。
测试语句
测试语句(DELETE和UPDATE)将根据lineitem表和orders表的时间列进行批量操作,测试语句示例如下:
- DELETE语句
- lineitem表
DELETE FROM lineitem WHERE l_shipdate >= YYYYMMDD AND l_shipdate <= YYYYMMDD;
- orders表
DELETE FROM orders WHERE o_orderdate >= YYYYMMDD AND o_orderdate <= YYYYMMDD;
- lineitem表
- UPDATE语句
- lineitem表
UPDATE lineitem SET l_quantity = 100.00, l_shipmode = 'test', l_comment = 'only_for_test' WHERE l_shipdate >= YYYYMMDD AND l_shipdate <= YYYYMMDD;
- orders表
UPDATE orders SET o_totalprice = 100.00, o_shippriority = 10, o_comment = 'only_for_test' WHERE o_orderdate >= YYYYMMDD AND o_orderdate <= YYYYMMDD;
- lineitem表
- SELECT语句
每次进行DELETE或UPDATE操作后,执行
SELECT count(1)
语句查看数据变更后的SELECT性能。- lineitem表
SELECT count(1) FROM lineitem;
- orders表
SELECT count(1) FROM orders;
- lineitem表
YYYYMMDD
请替换为需要查询的日期,例如'1995-05-05'
。
测试结果
未进行DELETE和UPDATE操作前,在lineitem表和orders表中执行SELECT count(1)
语句。测试结果如下:
表名 | Serverless模式 | 存储弹性模式 |
---|---|---|
lineitem | 40.3s | 177.9s |
orders | 8.0s | 40.5s |
在Serverless模式实例和存储弹性模式实例中并发对lineitem表和orders表执行DELETE和UPDATE操作,测试三遍,取平均值。测试结果如下:
批量操作 | 时间范围 | Serverless模式(lineitem表与orders表的执行总耗时) | 存储弹性模式(lineitem表与orders表的执行总耗时) | Serverless模式执行SELECT | 存储弹性模式执行SELECT |
---|---|---|---|---|---|
DELETE | 一天 | 32s | 290s |
lineitem表:40.7s orders表:8.2s |
lineitem表:214.3s orders表:56.8s |
半个月 | 38s | 827s |
lineitem表:41.6s orders表:8.5s |
lineitem表:657.1s orders表:170.0s |
|
一个月 | 40s | 994s |
lineitem表:41.7s orders表:8.3s |
lineitem表:788.9s orders表:197.3s |
|
UPDATE | 一天 | 104s | 300s |
lineitem表:41.6s orders表:8.5s |
lineitem表:206.6s orders表:57.2s |
半个月 | 110s | 824s |
lineitem表:42.7s orders表:8.4s |
lineitem表:650.0s orders表:172.4s |
|
一个月 | 114s | 988s |
lineitem表:42.9s orders表:8.5s |
lineitem表:784.1s orders表:201.8s |
通过以上测试结果可以得出以下信息:
- 批量执行DELETE和UPDATE时,Serverless模式实例比存储弹性模式实例执行速度快3~20倍,批量执行的数据量越大,性能差异越明显。
原因:批量执行DELETE和UPDATE是根据ORDER BY进行筛选的,Serverless模式实例的表采用了行列混存加ORDER BY的存储模式,对单列的过滤效率很高;而存储弹性模式实例的表在对列进行过滤时,需要读取所有数据,存在读放大的问题,且该列的过滤不会进行二分查找,所以性能相比Serverless模式较差。
- Serverless模式实例执行
SELECT count(1)
比存储弹性模式实例执行SELECT count(1)
速度快4~5倍。原因:Serverless模式实例的表的
count(1)
会按照列快速进行count,而存储弹性模式实例的表需要读取所有数据,存在读放大的问题。 - Serverless模式实例批量执行DELETE和UPDATE操作后再进行
SELECT count(1)
,性能方面几乎无差异。原因:Serverless模式实例的表按照列快速进行count并从delete bitmap中快速进行数据删除校验,不存在读放大的问题。