常见问题

更新时间:
复制 MD 格式

本文介绍了使用列存索引过程中可能遇见的问题及解决方案。

创建列存索引时提示:ERROR:  access method "csi" does not exist

需要创建polar_csi插件,请执行以下指令。

CREATE EXTENSION polar_csi;

创建列存索引较慢

可通过设置不同参数来加快索引创建速度,详情请参见提升索引创建速度

创建列存索引过程阻塞原表写入

  • 可以通过pg_cancel_backendpg_terminate_backend取消索引创建过程,以避免对业务造成影响,详细操作请参见开启和使用列存索引

  • 使用并发模式创建索引,即CREATE INDEX CONCURRENTLY方式,详情请参见创建列存索引

最新写入的数据无法在列存索引中被检索

  1. 确认当前查询是否使用列存索引,详细操作请参见开启和使用列存索引

  2. 确认当前查询已使用列存索引,可能原因是列存索引未能及时将行存数据同步至列存索引中。可通过调整相关参数来提升行列同步的速度,详情请参见开启和使用列存索引

  3. 默认情况下,列存索引使用最终一致性级别,因此查询时使用的数据可能是旧数据,可开启强一致性读功能来保证列存索引数据必须与行存数据一致后再返回,详情请参见开启和使用列存索引

开启强一致性功能后查询变慢

  1. 确认当前查询是否使用列存索引,详细操作请参见开启和使用列存索引

  2. 确认当前查询已使用列存索引,可能原因是列存索引未能及时将行存数据同步至列存索引中。可通过调整相关参数来提升行列同步的速度,详情请参见提升索引创建速度

  3. 如果行存表的写入量较大,且行列同步性能无法满足要求时,可以考虑关闭强一致性读功能,转而采用最终一致性。

    SET polar_csi.forward_replay_wait = off;

查询无法使用列存索引

请按如下步骤检查:

  1. 请根据您的PolarDB PostgreSQL版本确认是否开启了列存索引

    • 高版本可支持添加列存索引的只读节点,也可直接使用。

      PostgreSQL 16(2.0.16.9.8.0及以上)或PostgreSQL 14(2.0.14.17.35.0及以上)

      当前版本下的PolarDB PostgreSQL集群,支持两种开启方式,具体差异如下,请按需选择:

      对比项

      【推荐】添加列存索引只读节点

      直接使用预安装的列存索引插件

      操作方式

      通过控制台实现可视化操作,手动添加列存索引节点。

      无需任何操作,即可直接使用。

      资源分配

      列存引擎独占所有资源,能够充分利用所有内存。

      列存引擎只能使用25%的内存,其余内存则分配给行存引擎使用。

      业务影响

      TP(事务)与AP(分析)业务在不同节点上相互隔离,互不影响。

      TP(事务)与AP(分析)业务在同一节点,会互相影响。

      费用

      需额外收取列存索引只读节点的费用,按照普通计算节点收费。

      无费用。

      添加列存索引只读节点

      您可选择以下两种方式中任意一种方式添加列存索引只读节点:

      说明

      集群中应包含一个只读节点,即单节点集群不支持添加列存索引只读节点。

      控制台添加

      1. 登录PolarDB控制台,选择集群所在地域。您可以按照如下两种方式中的任意一种进入增删节点向导页面:

        • 集群列表页面,单击操作栏的增删节点

        • 在目标集群的基本信息页面,数据库节点区域,单击增删节点

      2. 选择增加列存索引只读节点选项,并单击确定

      3. 在集群变配页面,添加列存索引只读节点并支付。

        1. 单击增加一个列存索引只读节点,选择节点规格。

        2. 选择切换时间。

        3. (可选)查看产品服务协议、服务等级协议。

        4. 单击立即购买

      4. 支付完成后,返回集群详情页等待列存索引只读节点添加成功,即节点状态为运行中

      购买时添加

      PolarDB购买页节点个数配置项中自行选择列存索引只读节点数量。

    • 低版本需安装列存索引插件。

      PostgreSQL 16(2.0.16.8.3.0~2.0.16.9.8.0)或PostgreSQL 14(2.0.14.10.20.0~2.0.14.17.35.0)

      当前版本下的PolarDB PostgreSQL集群,列存索引作为插件polar_csi部署在数据库集群中,在使用之前需要在指定的数据库中创建插件。

      说明
      • polar_csi插件的作用域是Database级别,如果需要在集群的多个Database中使用列存索引,需要为每个Database分别创建polar_csi插件。

      • 安装插件使用的数据库账号必须为高权限账号

      您可以选择以下两种方式中的任意一种安装polar_csi插件。

      控制台安装

      1. 登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。

      2. 在左侧导航栏选择配置与管理 > 插件管理,在管理插件页签,选中未安装插件

      3. 在页面右上角选择目标数据库,单击polar_csi插件操作列安装,在弹出的安装插件对话框,选择目标数据库账号,单击确定,即将插件安装到目标数据库中。

      命令行安装

      连接数据库集群,并在具有相应权限的目标数据库中执行以下语句,创建polar_csi插件。

      CREATE EXTENSION polar_csi;
  2. 确认表是否创建列存索引,详情请参见开启和使用列存索引

  3. 确认查询语句所涉及的列是否都在加速索引中。例如,使用CREATE INDEX csi_idx_t ON t USING CSI(id,name);创建索引,使用SELECT id,name,age FROM t;查询时无法使用列存索引,这是因为查询语句中age字段并未包含在列存索引中。

  4. 确认是否开启列存索引,通过SHOW polar_csi.enable_query来确认,当结果为off时,表示该SQL语句无法使用列存索引,开启列存索引功能请参见开启和使用列存索引

  5. 确认查询语句的执行代价是否较小。当查询语句较为简单时,使用行存引擎效率更高。可通过ExplainExplain Analyze等工具打印查询计划,确认语句的查询代价,若需要忽略查询代价,强制查询语句使用列存索引,可将polar_csi.cost_threshold值设为0,其他注意事项请参见开启和使用列存索引

  6. 如果还无法使用列存索引加速,可执行SET client_min_messages = debug5进一步排查。

PolarDB ePQ的关系

PolarDB PostgreSQLePQ是基于云原生一写多读架构下,为了充分利用所有RO节点的计算资源而研发的跨机并行能力。ePQ能够将一个查询语句分发到所有的RO节点执行,而原生PostgreSQL的并行能力只能使用一个节点的计算资源,因此PolarDB PostgreSQLePQ比原生PostgreSQL具有更好的scale out能力。

PolarDB PostgreSQL的列存索引与ePQ并非同一种技术,列存索引的目标是在同样的硬件资源下提升计算效率,而ePQ的目标是能充分利用数据库集群的所有资源,二者相互补充。