GaussDB(DWS)条件表达式函数返回错误结果集排查

gaussdb,dws,条件,表达式,函数,返回,错误,结果,排查 · 浏览次数 : 20

小编点评

**摘要** 条件表达式函数中出现结果集不一致问题,作者分析了函数 `greatest` 和 `nvl` 的用法,并通过案例排查发现,`nvl(null,0)` 的类型为 `text`,而 `greatest` 函数对所有数据类型都支持。 **问题分析** 1. **`greatest(1,2,100,-1,0,nvl(null,0))`** 中存在 `int` 和 `text` 数据类型。 2. **`greatest(1,2,100,-1,0)`** 中所有参数都是 `int`。 **解决方案** 通过将 `nvl(null,0)` 替换为 `nvl(null,0)::int`,所有数据类型都转换为 `int`,使 `greatest` 函数能够正常处理输入数据。 **结论** 通过改写 SQL 语句,将 `nvl(null,0)` 替换为 `nvl(null,0)::int`,可以解决条件表达式函数中结果集不一致的问题。

正文

摘要:条件表达式函数中出现结果集不一致问题,我们首先要考虑是否入参数据类型不一致导致出参不一致。

本文分享自华为云社区《GaussDB(DWS)条件表达式函数返回错误结果集排查》,作者:yd_211369925 。

(一)案例背景

客户使用greatest获取并返回参数列表中值最大的表达式的值,子查询中查询结果与将子查询的结果粘出来单独执行结果集不一致。

select greatest(1,2,100,-1,0,nvl(null,0)) --结果为2,select nvl(null,0)的结果为0
select greatest(1,2,100,-1,0,0) --结果为100

(二)问题排查

首先我们要了解greatest和nvl两个函数的用法

客户使用的版本为dws820环境为mysql兼容模式,nvl(null,0)结果类型为unknown的类型即为text;

第一条greatest(1,2,100,-1,0,nvl(null,0))参数中存在int和text,即按字符排序2最大;

第二条greatest(1,2,100,-1,0)参数均为int,输出按数值排序100最大;

拓展:

对于一些非条件表达式函数可以通过\df+ 函数名(这里用min来举例) 查找入参和出参的数据类型

或者先使用 select proname,proisstrict,provolatile,prorettype,proargtypes,prosrc,proshippable from pg_proc where proname = '函数名';

再使用select oid,typname from pg_type where oid =‘xxx’;(这里oid根据上述的prorettype,proargtypes来查询)

具体函数重要属性参考

GaussDB(DWS)函数下推属性介绍
https://bbs.huaweicloud.com/blogs/250351

(三)解决方案

从上述排查中可知将,改写第一条语句,使用nvl(null,0)::int替换nvl(null,0)使得greatest函数中所有数据类型均为int即可

SELECT greatest(1,2,100,-1,0,nvl(null,0)::int)

此时结果是,100符合客户预期结果。

 

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

与GaussDB(DWS)条件表达式函数返回错误结果集排查相似的内容:

GaussDB(DWS)条件表达式函数返回错误结果集排查

摘要:条件表达式函数中出现结果集不一致问题,我们首先要考虑是否入参数据类型不一致导致出参不一致。 本文分享自华为云社区《GaussDB(DWS)条件表达式函数返回错误结果集排查》,作者:yd_211369925 。 (一)案例背景 客户使用greatest获取并返回参数列表中值最大的表达式的值,子查

GaussDB(DWS)性能调优,解决DM区大内存占用问题

本文分享自华为云社区《GaussDB(DWS)性能调优:DM区优化案例——维度表关联条件存在会计期》,作者: O泡果奶~。 当前DM(P1、P3、CBGDM)存在维度表与主表关联时使用会计期作为关联条件,会导致出现大内存占用或未识别数据倾斜的问题 【场景一】f.period_id = 维度表.per

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

摘要:用户创建hash分布表,使用pbe方式执行使用分布列作为查询条件的语句时报错 本文分享自华为云社区《GaussDB(DWS)现网案例之collation报错》,作者: 你是猴子请来的救兵吗 。 用户创建hash分布表,使用pbe方式执行使用分布列作为查询条件的语句时报错,ERROR: coul

解读数仓中的数据对象及相关关系

摘要:为实现不同的功能,GaussDB(DWS)提供了不同的数据对象类型,包括索引、行存表、列存表及其辅助表等。这些数据对象在特定的条件下实现不同的功能,为数据库的快速高效提供了保证,本文对部分数据对象进行介绍。 本文分享自华为云社区《GaussDB(DWS)之数据对象及相互关系总结》,作者:我的橘

优化数仓业务视图:过滤条件传递

摘要:在业务功能实现时,经常会用到视图简化查询SQL。但有时候会因为视图降低查询效率,本文主要分析在业务需求满足的情况下,将有效的过滤条件传递到基表,减少运算过程中数据库需要处理的数据量,提升SQL执行效率。 本文分享自华为云社区《GaussDB(DWS)业务视图优化-过滤条件传递》,作者:卫小毛

从GaussDB(DWS)的技术演进,看数据仓库的积淀与新生

摘要:随着云计算的兴起和渗透,云数仓成为了数仓技术演进的新阶段,并且逐渐成为了众多企业的共同选择。 本文分享自华为云社区《从GaussDB(DWS)的技术演进,看数据仓库的积淀与新生》,作者: 华为云头条。 数据驱动着现代商业的发展 今天,无论在制造、零售、物流 还是在互联网、金融等行业 数据都变得

详解GaussDB(DWS)中的行执行引擎

本文分享自华为云社区《GaussDB(DWS)行执行引擎详解》,作者:yd_227398895。 1.前言 GaussDB(DWS)包含三大引擎,一是SQL执行引擎,用来解析用户输入的SQL语句,生成执行计划,供执行引擎来执行;二是执行引擎,其中包含了行执行引擎和列执行引擎,执行引擎即查询的执行者,

云小课|GaussDB(DWS)数据存储尽在掌控,冷热数据切换自如

阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要: GaussDB(DWS)支持根据业务系统的不同使用需求,对膨胀的数据进行冷热分级管理,将数据按照时间分为热数据、冷数

GaussDB(DWS)性能调优:indexscan导致的性能问题识别与优化

摘要:通常跑批加工场景下,都是大数量做关联操作,通常不建议使用索引。有些时候因为计划误判导致使用索引的可能会导致严重的性能问题。本文从一个典型的索引导致性能的场景重发,剖析此类问题的特征,定位方法和解决方法 本文分享自华为云社区《GaussDB(DWS)性能调优:indexscan导致的性能问题识别

GaussDB(DWS)案例丨MERGE场景下语句不下推引起的性能瓶颈问题

本文针对MERGE场景下SQL语句因执行不下推而导致执行效率低下的案例进行分析。