本文介绍了使用向量化引擎过程中可能遇见的问题及解决方案。
创建列存索引时提示:ERROR: access method "csi" does not exist
需要创建polar_csi
插件,请执行以下指令。
CREATE EXTENSION polar_csi;
创建列存索引较慢
可通过设置不同参数来加快索引创建速度,详情请参考性能调优:提升索引创建速度。
创建列存索引过程阻塞原表写入
最新写入的数据无法在列存索引中被检索
确认当前查询是否使用列存索引,详细操作请参考查看SQL是否使用列存索引。
确认当前查询已使用列存索引,可能原因是向量化引擎未能及时将行存数据同步至列存索引中。可通过调整相关参数来提升行列同步的速度,详情请参考列存索引的实时性。
默认情况下,向量化引擎使用最终一致性级别,因此查询时使用的数据可能是旧数据,可开启强一致性读功能来保证列存索引数据必须与行存数据一致后再返回,详情请参考查询一致性。
开启强一致性功能后查询变慢
确认当前查询是否使用列存索引,详细操作请参考查看SQL是否使用列存索引。
确认当前查询已使用列存索引,可能原因是向量化引擎未能及时将行存数据同步至列存索引中。可通过调整相关参数来提升行列同步的速度,详情请参考列存索引的实时性。
如果行存表的写入量较大,且行列同步性能无法满足要求时,可以考虑关闭强一致性读功能,转而采用最终一致性。
SET polar_csi.forward_replay_wait = off;
查询无法使用列存索引/向量化引擎
请按如下步骤检查:
确认是否安装向量化引擎插件,详情请参考安装向量化引擎插件。
确认表是否创建列存索引,详情请参考创建列存索引。
确认查询语句所涉及的列是否都在加速索引中。例如,使用
CREATE INDEX csi_idx_t ON t USING CSI(id,name);
创建索引,使用SELECT id,name,age FROM t;
查询时无法使用列存索引,这是因为查询语句中age字段并未包含在列存索引中。确认是否开启向量化查询,通过
SHOW polar_csi.enable_query
来确认,当结果为 off 时,表示没有该 SQL语句无法使用列存索引,开启向量化引擎功能请参考参数设置。确认查询语句的执行代价是否较小。当查询语句较为简单时,使用行存引擎效率更高。可通过Explain或Explain Analyze等工具打印查询计划,确认语句的查询代价,若需要忽略查询代价,强制查询语句使用列存索引,可将
polar_csi.cost_threshold
值设为0,其他注意事项请参考参数设置。如果还无法使用向量化引擎加速,可执行
SET client_min_messages = debug5
进一步排查。
与PolarDB ePQ的关系
PolarDB PostgreSQL版的ePQ是基于云原生一写多读架构下,为了充分利用所有RO节点的计算资源而研发的跨机并行能力。ePQ能够将一个查询语句分发到所有的RO节点执行,而原生PostgreSQL的并行能力只能使用一个节点的计算资源,因此PolarDB PostgreSQL版的ePQ比原生PostgreSQL具有更好的scale out
能力。
PolarDB PostgreSQL版的向量化引擎与ePQ并非同一种技术,向量化引擎的目标是在同样的硬件资源下提升计算效率,而ePQ的目标是能充分利用数据库集群的所有资源,二者相互补充。