免费体验PolarDB PostgreSQL列存索引

本文介绍如何免费体验PolarDB PostgreSQL列存索引功能。

背景

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

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

  • 低成本:只需为查询用到的列创建列存索引,无需将整表转成列存。列存格式索引占用的空间小。此外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. 前往瑶池解决方案体验馆,免费体验列存索引/表-加速TP复杂SQL查询

  2. 在产品选项中选择PolarDB PostgreSQLimage

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

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

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

    image

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

  7. 使用行存引擎和列存引擎分别进行单表统计和多表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;

        此时查询计划中并未使用列存索引,返回结果如下:image

      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;

        返回结果如下,执行时间为21.034秒,且可以观察到CPU占有率显著升高。imageimage

      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;

        此时查询计划使用列存索引,返回结果如下:image

      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.444秒,且可以观察到CPU占有率并无明显变化。imageimage

    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;

        此时查询计划中并未使用列存索引,返回结果如下:image

      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;

        返回结果如下,执行时间为6.789秒,且可以观察到CPU占有率显著升高。

        说明

        观察CPU占有率时,您可单击图表下方的正常查询向量化引擎以观察两者之间的CPU占有率对比。

        imageimage

      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;

        此时查询计划使用列存索引,返回结果如下:image

      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.325秒,且可以观察到CPU占有率并无明显变化。

        说明

        观察CPU占有率时,您可单击图表下方的正常查询向量化引擎以观察两者之间的CPU占有率对比。

        imageimage

  8. 整个执行SQL的过程中,您可以在左侧趋势图中观测集群平均CPU使用率的变化情况。

    说明

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

  9. (可选)对于已创建的任务,您可以在列存索引-加速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。