免费体验PolarDB PostgreSQL向量化引擎

本文介绍如何免费体验PolarDB PostgreSQL向量化引擎功能。

背景

PolarDB向量化引擎是针对HTAP场景、OLTP中的慢SQL场景而研发的查询加速方案。典型使用场景包括:实时的统计与分析、灵活查询条件(复合索引不灵活)、基于地理网格的时空统计、与OSS结合的冷数据加速统计等。具体优势包括:

  • 高性能:与PostgreSQL原生行存执行引擎相比,性能可提升15-30倍,最高可提升百倍。比如在TPC-H场景下,可提升近30倍。

  • 低成本:只需为查询用到的列创建列存索引,无需将整表转成列存。列存格式索引占用的空间小。此外PolarDB PostgreSQL支持OSS冷数据查询与分析,可以有效降低数据存储成本。

  • 易用性:兼容PostgreSQL语法,支持基于PostgreSQL的索引机制。支持精细化控制OLTPOLAP查询。

  • 实时性:自动维护行存与列存索引之间的实时数据一致性,无需额外构建行列数据转换链路。

  • 功能全面:

    • 支持Prepared Statement语法。

    • 支持分区表与pg_pathman

    • 支持事务块内SELECT语句的加速。

    • 支持CREATE TABLE ASETL功能。

阿里云提供了数据库解决方案功能体验馆,提供真实免费的PolarDB集群环境和开箱即用的测试方法,您可以在线快捷体验向量化引擎带来的提升效果。

影响

本功能体验不涉及生产环境的部署,因此不会影响业务。

费用

本次体验中,由于体验涉及到的资源不归属于您,因此不会产生任何费用,您可以放心体验。

体验内容

体验环境

在本免费体验中,阿里云提供了预置环境供您操作体验,预置环境的详情如下:

  • 集群:提供了一个PolarDB PostgreSQL集群。具体如下:

    • 内核版本: 14.13.27.0

    • 产品版本:企业版

    • 系列:集群版独享规格

    • 集群规格:集群包含1个主节点和1个只读节点,规格都为28 GB

    • 存储类型: PSL5

  • 测试数据集:集群中预置了标准测试集TPCH 10G的数据集。

观测指标

  • CPU占用率:集群中主节点、只读节点和只读列存节点的平均CPU使用率。单位:%。

  • 查询耗时:执行特定SQL所耗费的时间。单位:秒。

操作步骤

  1. 进入瑶池解决方案体验馆

  2. 单击核心功能体验,然后单击列存索引-加速TP复杂SQL查询的免费体验按钮。

  3. 在产品选项中选择PolarDB PostgreSQL

    image

  4. 单击页面下方的创建免费体验任务按钮。

  5. 确认创建查询加速体验任务对话框中,单击确定

  6. 稍等片刻后,可以看到您创建的体验任务。

    image

  7. 单击查看详情,进入实时查询体验页面。

  8. 使用行存引擎和向量化引擎分别进行单表统计和多表JOIN两个场景的SQL语句查询。

    说明
    • 请根据页面按钮提示,手动单击按钮执行每一步操作。若在倒计时结束时没有手动单击按钮,则会自动执行对应操作。

    • 整个体验过程中,您可以在下方的趋势图中观测CPU占用率。

    1. 单击开始任务

    2. 单击选择数据库,自动执行如下命令,切换至目标数据库。

      \c mydb
    3. 首先进行单表统计场景查询。

      1. 首先进行单表统计的普通查询,单击关闭向量化引擎,自动执行如下命令。

        set polar_csi.enable_query to off;
      2. 单击查看SQL执行计划,自动执行如下命令,查看如下SQL的执行计划。

        explain select
           l_returnflag,
           l_linestatus,
           sum(l_quantity) as sum_qty,
           sum(l_extendedprice) as sum_base_price,
           sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
           sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
           avg(l_quantity) as avg_qty,
           avg(l_extendedprice) as avg_price,
           avg(l_discount) as avg_disc,
           count(*) as count_order
        from
           lineitem
        where l_shipdate <= date '1998-12-01' - '60 day'::interval
         group by
           l_returnflag,
           l_linestatus
        order by
           l_returnflag,
           l_linestatus;

        此时查询计划中并未使用向量化引擎/列存索引,返回结果如下:

                                                      QUERY PLAN                                               
        -------------------------------------------------------------------------------------------------------
         Finalize GroupAggregate  (cost=2307510.18..2307512.14 rows=6 width=236)
           Group Key: l_returnflag, l_linestatus
           ->  Gather Merge  (cost=2307510.18..2307511.58 rows=12 width=236)
                 Workers Planned: 2
                 ->  Sort  (cost=2306510.16..2306510.17 rows=6 width=236)
                       Sort Key: l_returnflag, l_linestatus
                       ->  Partial HashAggregate  (cost=2306509.95..2306510.08 rows=6 width=236)
                             Group Key: l_returnflag, l_linestatus
                             ->  Parallel Seq Scan on lineitem  (cost=0.00..1437900.14 rows=24817423 width=25)
                                   Filter: (l_shipdate <= '1998-10-02 00:00:00'::timestamp without time zone)
        (10 rows)
      3. 单击执行SQL,自动执行以下SQL语句:

        select
           l_returnflag,
           l_linestatus,
           sum(l_quantity) as sum_qty,
           sum(l_extendedprice) as sum_base_price,
           sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
           sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
           avg(l_quantity) as avg_qty,
           avg(l_extendedprice) as avg_price,
           avg(l_discount) as avg_disc,
           count(*) as count_order
        from
           lineitem
        where l_shipdate <= date '1998-12-01' - '60 day'::interval
         group by
           l_returnflag,
           l_linestatus
        order by
           l_returnflag,
           l_linestatus;

        返回结果如下,执行时间为29.998秒。

         l_returnflag | l_linestatus |   sum_qty    |  sum_base_price  |   sum_disc_price   |      sum_charge      |       avg_qty       |     avg_price      |        avg_disc        | count_order 
        --------------+--------------+--------------+------------------+--------------------+----------------------+---------------------+--------------------+------------------------+-------------
         A            | F            | 377518399.00 |  566065727797.25 |  537759104278.0656 |  559276670892.116819 | 25.5009751030070973 | 38237.151008958546 | 0.05000657454024320463 |    14804077
         N            | F            |   9851614.00 |   14767438399.17 |   14028805792.2114 |   14590490998.366737 | 25.5224483028409474 | 38257.810660081140 | 0.04997336773765667180 |      385998
         N            | O            | 755019122.00 | 1132129731453.74 | 1075518177478.8293 | 1118551353535.822147 | 25.4984266349481027 | 38234.166602626373 | 0.05000018236823388523 |    29610420
         R            | F            | 377732830.00 |  566431054976.00 |  538110922664.7677 |  559634780885.086257 | 25.5083847896801383 | 38251.219273559761 | 0.04999679231408742045 |    14808183
        (4 rows)
        
        Time: 29998.041 ms (00:29.998)
      4. 然后进行单表统计的加速查询。单击开启向量化引擎,自动执行如下命令。

        set polar_csi.enable_query to on;
      5. 单击查看SQL执行计划,自动执行如下命令,查看如下SQL的执行计划。

        explain select
           l_returnflag,
           l_linestatus,
           sum(l_quantity) as sum_qty,
           sum(l_extendedprice) as sum_base_price,
           sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
           sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
           avg(l_quantity) as avg_qty,
           avg(l_extendedprice) as avg_price,
           avg(l_discount) as avg_disc,
           count(*) as count_order
        from
           lineitem
        where l_shipdate <= date '1998-12-01' - '60 day'::interval
         group by
           l_returnflag,
           l_linestatus
        order by
           l_returnflag,
           l_linestatus;

        此时查询计划使用向量化引擎/列存索引,返回结果如下:

          QUERY PLAN  
        --------------
         CSI Executor
        (1 row)
      6. 单击执行SQL,自动执行以下SQL语句:

        select
           l_returnflag,
           l_linestatus,
           sum(l_quantity) as sum_qty,
           sum(l_extendedprice) as sum_base_price,
           sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
           sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
           avg(l_quantity) as avg_qty,
           avg(l_extendedprice) as avg_price,
           avg(l_discount) as avg_disc,
           count(*) as count_order
        from
           lineitem
        where l_shipdate <= date '1998-12-01' - '60 day'::interval
         group by
           l_returnflag,
           l_linestatus
        order by
           l_returnflag,
           l_linestatus;

        返回结果如下,执行时间为0.496秒。

         l_returnflag | l_linestatus |   sum_qty    |  sum_base_price  |   sum_disc_price   |      sum_charge      |     avg_qty      |    avg_price     |      avg_disc      | count_order 
        --------------+--------------+--------------+------------------+--------------------+----------------------+------------------+------------------+--------------------+-------------
         A            | F            | 377518399.00 |  566065727797.25 |  537759104278.0656 |  559276670892.116819 | 25.5009751030071 | 38237.1510089585 | 0.0500065745402432 |    14804077
         N            | F            |   9851614.00 |   14767438399.17 |   14028805792.2114 |   14590490998.366737 | 25.5224483028409 | 38257.8106600811 | 0.0499733677376567 |      385998
         N            | O            | 755019122.00 | 1132129731453.74 | 1075518177478.8293 | 1118551353535.822147 | 25.4984266349481 | 38234.1666026264 | 0.0500001823682339 |    29610420
         R            | F            | 377732830.00 |  566431054976.00 |  538110922664.7677 |  559634780885.086257 | 25.5083847896801 | 38251.2192735598 | 0.0499967923140874 |    14808183
        (4 rows)
        
        Time: 496.226 ms
    4. 开始进行多表JOIN场景查询。

      1. 首先进行多表JOIN的普通查询,单击关闭向量化引擎,自动执行如下命令。

        set polar_csi.enable_query to off;
      2. 单击查看SQL执行计划,自动执行如下命令,查看如下SQL的执行计划。

        explain select
           l_orderkey,
           sum(l_extendedprice * (1 - l_discount)) as revenue,
           o_orderdate,
           o_shippriority
        from
           customer,orders,
           lineitem
        where
           c_mktsegment = 'FURNITURE'
           and c_custkey = o_custkey
           and l_orderkey = o_orderkey
           and o_orderdate < date '1995-03-05'
           and l_shipdate > date '1995-03-05'
        group by
           l_orderkey,
           o_orderdate,
           o_shippriority
        order by revenue desc, o_orderdate limit 10;

        此时查询计划中并未使用向量化引擎/列存索引,返回结果如下:

                                                                      QUERY PLAN                                                              
        --------------------------------------------------------------------------------------------------------------------------------------
         Limit  (cost=2714604.62..2714604.64 rows=10 width=44)
           ->  Sort  (cost=2714604.62..2722505.04 rows=3160168 width=44)
                 Sort Key: (sum((lineitem.l_extendedprice * ('1'::numeric - lineitem.l_discount)))) DESC, orders.o_orderdate
                 ->  Finalize GroupAggregate  (cost=2230423.64..2646314.52 rows=3160168 width=44)
                       Group Key: lineitem.l_orderkey, orders.o_orderdate, orders.o_shippriority
                       ->  Gather Merge  (cost=2230423.64..2573894.00 rows=2633474 width=44)
                             Workers Planned: 2
                             ->  Partial GroupAggregate  (cost=2229423.62..2268925.73 rows=1316737 width=44)
                                   Group Key: lineitem.l_orderkey, orders.o_orderdate, orders.o_shippriority
                                   ->  Sort  (cost=2229423.62..2232715.46 rows=1316737 width=24)
                                         Sort Key: lineitem.l_orderkey, orders.o_orderdate, orders.o_shippriority
                                         ->  Parallel Hash Join  (cost=434379.92..2063951.34 rows=1316737 width=24)
                                               Hash Cond: (lineitem.l_orderkey = orders.o_orderkey)
                                               ->  Parallel Seq Scan on lineitem  (cost=0.00..1437900.14 rows=13555969 width=16)
                                                     Filter: (l_shipdate > '1995-03-05'::date)
                                               ->  Parallel Hash  (cost=423823.16..423823.16 rows=607261 width=12)
                                                     ->  Parallel Hash Join  (cost=46232.51..423823.16 rows=607261 width=12)
                                                           Hash Cond: (orders.o_custkey = customer.c_custkey)
                                                           ->  Parallel Seq Scan on orders  (cost=0.00..339779.89 rows=3011708 width=16)
                                                                 Filter: (o_orderdate < '1995-03-05'::date)
                                                           ->  Parallel Hash  (cost=44164.29..44164.29 rows=126018 width=4)
                                                                 ->  Parallel Seq Scan on customer  (cost=0.00..44164.29 rows=126018 width=4)
                                                                       Filter: (c_mktsegment = 'FURNITURE'::bpchar)
        (23 rows)
        
      3. 单击执行SQL,自动执行以下SQL语句:

        select
           l_orderkey,
           sum(l_extendedprice * (1 - l_discount)) as revenue,
           o_orderdate,
           o_shippriority
        from
           customer,orders,
           lineitem
        where
           c_mktsegment = 'FURNITURE'
           and c_custkey = o_custkey
           and l_orderkey = o_orderkey
           and o_orderdate < date '1995-03-05'
           and l_shipdate > date '1995-03-05'
        group by
           l_orderkey,
           o_orderdate,
           o_shippriority
        order by revenue desc, o_orderdate limit 10;

        返回结果如下,执行时间为15.105秒。

         l_orderkey |   revenue   | o_orderdate | o_shippriority 
        ------------+-------------+-------------+----------------
           16716836 | 457530.6898 | 1995-01-28  |              0
           49108805 | 437309.8833 | 1995-02-24  |              0
           59180740 | 424083.7684 | 1995-02-04  |              0
            3459808 | 423001.2631 | 1995-03-04  |              0
           26812736 | 422055.4106 | 1995-02-27  |              0
           19938211 | 421534.7725 | 1995-02-16  |              0
           44247173 | 421467.1845 | 1995-02-14  |              0
           10666915 | 415306.2064 | 1995-02-14  |              0
           23005989 | 413233.6425 | 1995-01-22  |              0
           35934054 | 412331.2913 | 1995-02-17  |              0
        (10 rows)
        
        Time: 15104.732 ms (00:15.105)
      4. 然后进行单表统计的加速查询。单击开启向量化引擎,自动执行如下命令。

        set polar_csi.enable_query to on;
      5. 单击查看SQL执行计划,自动执行如下命令,查看如下SQL的执行计划。

        explain select
           l_orderkey,
           sum(l_extendedprice * (1 - l_discount)) as revenue,
           o_orderdate,
           o_shippriority
        from
           customer,orders,
           lineitem
        where
           c_mktsegment = 'FURNITURE'
           and c_custkey = o_custkey
           and l_orderkey = o_orderkey
           and o_orderdate < date '1995-03-05'
           and l_shipdate > date '1995-03-05'
        group by
           l_orderkey,
           o_orderdate,
           o_shippriority
        order by revenue desc, o_orderdate limit 10;

        此时查询计划使用向量化引擎/列存索引,返回结果如下:

          QUERY PLAN  
        --------------
         CSI Executor
        (1 row)
      6. 单击执行SQL,自动执行以下SQL语句:

        select
           l_orderkey,
           sum(l_extendedprice * (1 - l_discount)) as revenue,
           o_orderdate,
           o_shippriority
        from
           customer,orders,
           lineitem
        where
           c_mktsegment = 'FURNITURE'
           and c_custkey = o_custkey
           and l_orderkey = o_orderkey
           and o_orderdate < date '1995-03-05'
           and l_shipdate > date '1995-03-05'
        group by
           l_orderkey,
           o_orderdate,
           o_shippriority
        order by revenue desc, o_orderdate limit 10;

        返回结果如下,执行时间为0.354秒。

         l_orderkey |   revenue   | o_orderdate | o_shippriority 
        ------------+-------------+-------------+----------------
           16716836 | 457530.6898 | 1995-01-28  |              0
           49108805 | 437309.8833 | 1995-02-24  |              0
           59180740 | 424083.7684 | 1995-02-04  |              0
            3459808 | 423001.2631 | 1995-03-04  |              0
           26812736 | 422055.4106 | 1995-02-27  |              0
           19938211 | 421534.7725 | 1995-02-16  |              0
           44247173 | 421467.1845 | 1995-02-14  |              0
           10666915 | 415306.2064 | 1995-02-14  |              0
           23005989 | 413233.6425 | 1995-01-22  |              0
           35934054 | 412331.2913 | 1995-02-17  |              0
        (10 rows)
        
        Time: 354.131 ms
  9. 整个执行SQL的过程中,您可以在左侧趋势图中观测集群平均CPU使用率的变化情况。

    说明

    由于实时监控数据可能存在延迟,为了确保展示完整的CPU变化情况,趋势图中会在SQL执行完后,自动延长一定监控时间(2~3秒)。

  10. (可选)对于已创建的任务,您可以在列存索引-加速TP复杂SQL查询页面,单击体验记录,在任务列表中,单击全部任务我的任务,查看体验结果及其详情。

结果分析

从本方案中您可以体验到PolarDB PostgreSQL向量化引擎的如下优势:

1. 使用方式简单,无需更改查询SQL即可实现加速效果。

2. 针对单表统计和多表Join场景,向量化引擎均有近30倍以上的性能提升。

向量化引擎对查询有明显加速作用

  • 从执行时间上看,当开启向量化引擎后,复杂查询执行时间大幅缩短,单表统计查询从29.998秒缩短至0.496秒,多表JOIN查询从15.105秒缩短至0.354秒。

  • 从执行计划上看,当开启向量化引擎后,执行计划包含CSI Executor,即表示使用向量化引擎功能。

向量化引擎对查询的处理更高效

说明

由于实时监控数据可能存在延迟,为了确保展示完整的CPU变化情况,趋势图中会在SQL执行完后,自动延长一定监控时间(2~3秒)。

从执行时间和对应的CPU占用率可以看到,向量化引擎通过更低的CPU占用率实现了更快的查询。

image

单表统计查询

image

多表JOIN查询

相关内容

专家面对面

您可以加入官方钉钉群进行咨询,获取更多技术支持。钉钉群号:75850003226。