写点什么

GaussDB(DWS) 现网案例:collation 报错

  • 2023-02-09
    中国香港
  • 本文字数:800 字

    阅读完需:约 3 分钟

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,导致执行报错


场景复现


建表数据


drop table t1;create table t1(c1 nvarchar2(5),c2 varchar)with (orientation=column)distribute by hash(c1);--分布列类型为nvarchar2(n)insert into t1(c1) values(generate_series(1,10));
复制代码


场景 1:client + p/e


prepare c1(nvarchar2) as select c2 from t1 where c1 = $1;execute c1(5);
复制代码


场景 2:jdbc + p/b/e


PreparedStatement pstmt = con.prepareStatement("select c2 from t1 where c1 = ?;");pstmt.setString(1, "5");ResultSet rs = pstmt.executeQuery();
复制代码


场景 3:jalor + *Dao.*.xml


<delete id="query">	select c2 from t1 where c1 = #{c1}</delete>
复制代码


规避办法


任选一种既可,推荐第一种,改动小影响小


  1. 将分布列类型 nvarchar2(n)修改为 nvarchar2 或 varchar(n)

  2. 使用拼接 sql 的办法执行语句,而不是 pbe

  3. 语句中指定 collate 子句,如 select c2 from t1 where c1 collate "default" = ?;

  4. 升级版本

知识小结


问题条件:


  1. 内核版本 8.1.3 ≤ version ≤ 8.1.3.300

  2. 分布列包含 nvarchar2(n)类型字段

  3. 使用 pbe 的方式执行语句

  4. 语句过滤条件包含所有分布列


规避方法:


打破以上任一条件即可规避


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
GaussDB(DWS)现网案例:collation报错_数据库_华为云开发者联盟_InfoQ写作社区