本文介绍AnalyticDB PostgreSQL版Serverless模式实例批量DELETE和UPDATE的性能。

说明 本文的TPC-H的实现基于TPC-H的基准测试,并不能与已发布的TPC-H基准测试结果相比较,本文中的测试并不符合TPC-H基准测试的所有要求。

测试实例

创建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;
  • 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;
  • SELECT语句

    每次进行DELETE或UPDATE操作后,执行SELECT count(1)语句查看数据变更后的SELECT性能。

    • lineitem表
      SELECT count(1) FROM lineitem;
    • orders表
      SELECT count(1) FROM orders;
说明 以上示例语句中的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中快速进行数据删除校验,不存在读放大的问题。