GaussDB(DWS) 现网案例:collation 报错
本文分享自华为云社区《GaussDB(DWS)现网案例之collation报错》,作者: 你是猴子请来的救兵吗 。
用户创建 hash 分布表,使用 pbe 方式执行使用分布列作为查询条件的语句时报错,ERROR: could not determine which collation to use for string hashing
问题背景
内核版本:GaussDB 8.1.3
业务框架:jalor + mybatis
问题描述:用户创建 hash 分布表,使用 pbe 方式执行使用分布列作为查询条件的语句时报错,ERROR: could not determine which collation to use for string hashing
根因分析
源表为 hash 分布表,当使用分布列作为查询条件时,可以通过节点分区剪枝提升性能;
分布列类型为 nvarchar2(100),构造 pbe 剪枝语句时,需要对传入变量进行类型转换和精度转换,未正确更新 collation,导致执行报错
场景复现
建表数据
场景 1:client + p/e
场景 2:jdbc + p/b/e
场景 3:jalor + *Dao.*.xml
规避办法
任选一种既可,推荐第一种,改动小影响小
将分布列类型 nvarchar2(n)修改为 nvarchar2 或 varchar(n)
使用拼接 sql 的办法执行语句,而不是 pbe
语句中指定 collate 子句,如 select c2 from t1 where c1 collate "default" = ?;
升级版本
知识小结
问题条件:
内核版本 8.1.3 ≤ version ≤ 8.1.3.300
分布列包含 nvarchar2(n)类型字段
使用 pbe 的方式执行语句
语句过滤条件包含所有分布列
规避方法:
打破以上任一条件即可规避
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/05de81ce1cfa5cda6eb30a870】。文章转载请联系作者。
评论