GaussDB(DWS)迁移实践丨row_number输出结果不一致

gaussdb,dws,迁移,实践,row,number,输出,结果,一致 · 浏览次数 : 91

小编点评

## Summary **Problem:** * Row_number字段值在迁移前后不一致,导致DWS运行不一致。 **Cause:** * PARTITION BY 列 + ORDER BY 列组合起来不唯一,导致row_number()开窗函数结果集不稳定。 **Solution:** * 使用函数rank()代替函数row_number(),二者的区别请戳这里。 * 如果关注PARTITION BY 列 + ORDER BY 列组合值一样的记录的排序,则需要增 ORDER BY 列,以保证同一个组内所有记录的唯一性。 **Case Example:** | Before | After | |---|---| | SELECT no_tax_ind_amt, row_number() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rn FROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f sLEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_keyLEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_key | | SELECT no_tax_ind_amt, s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no, -- PARTITION BY 列 + ORDER BY 列 row_number() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rn, rank() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rk FROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f sLEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_keyLEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_keyWHERE actual_arrv_period_id = 202109AND s.transp_demand_no='0FF7640001270MCHN01H' | **Conclusion:** * 同一个开窗逻辑下,rank()值都相同,但所有记录中s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no的值都是一样的。

正文

摘要:迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。

本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一致》,作者:譡里个檔 。

【问题表现】

迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。

【问题分析】

这种问题大部分都是因为PARTITION BY 列 + ORDER BY 列组合起来不唯一,导致row_number()开窗函数结果集不稳定。

【解决方案】

如果不关注PARTITION BY 列 + ORDER BY 列组合值一样的记录的排序,那么可以使用函数rank()代替函数row_number(),二者的区别请戳这里;如果关注PARTITION BY 列 + ORDER BY 列组合值一样的记录的排序,那么需要增 ORDER BY 列,以保证同一个组内所有记录的唯一性。

【案例展示】

某客户反馈进行Orale迁移前,如下SQL结果集稳定;迁移后DWS运行结果和oracle不一致,且DWS本身运行结果不稳定

SELECT 
 no_tax_ind_amt,
 row_number() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rn
FROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f s
LEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_key
LEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_key
WHERE actual_arrv_period_id = 202109
AND s.transp_demand_no='0FF7640001270MCHN01H'
;

前后两次执行结果

1)第一次执行

2)第二次执行

问题定位分析方位为执行如下语句

SELECT 
 no_tax_ind_amt,
 s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no, -- PARTITION BY 列 + ORDER BY 列
 row_number() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rn,
 rank()       OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rk
FROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f s
LEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_key
LEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_key
WHERE actual_arrv_period_id = 202109
AND s.transp_demand_no='0FF7640001270MCHN01H'
;

可以看出相同的开窗逻辑下rank()值都1,而且所有记录中s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no(即PARTITION BY 列 + ORDER BY 列)的值都是一样的

 

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

与GaussDB(DWS)迁移实践丨row_number输出结果不一致相似的内容:

GaussDB(DWS)迁移实践丨row_number输出结果不一致

摘要:迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一致》,作者:譡里个檔 。 【问题表现】 迁移前后结果集row_number字段值前后不一致,前在DWS上运

GaussDB(DWS)迁移:一种执行高效的TereData的marco迁移方案

摘要:提供一种执行高效的TereData的marco迁移方案。 本文分享自华为云社区《GaussDB(DWS)迁移 - teredata兼容 -- macro兼容 # 【玩转PB级数仓GaussDB(DWS)】》,作者: 譡里个檔 。 Teradata的宏是一组可以接受参数的SQL语句,通过调用宏名

一种DWS迁移Oracle的CONNECT BY语法的方案

摘要:本文提供一种GaussDB DWS迁移CONNECT BY语法方案。 本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 -- CONNECT BY迁移》,作者: 譡里个檔 。 CONNECT BY NOCYCLE 1) 预置对象定义 DROP SCHEMA IF EXI

DSC:数仓SQL脚本迁移的神奇工具

摘要:本文介绍的DSC工具是针对数据库切换时面临的迁移任务而开发的免安装命令行工具。目的是提供简单、快速、可靠的SQL脚本迁移服务。 本文分享自华为云社区《GaussDB(DWS)DSC工具系列:DSC工具初识【玩转PB级数仓GaussDB(DWS)】》,作者:积少成多 。 DSC背景介绍与DSC介

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

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

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

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

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

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

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

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

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

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

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

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