GaussDB(DWS) の移行実践丨row_number の出力結果が一貫していません

概要: 結果セットの row_number フィールドの値は、移行の前後で一貫性がなく、DWS で実行する前も一貫していません。

この記事は、Huawei Cloud Community「GaussDB (DWS) Migration - Oracle Compatibility - row_number Output results are inconsistent」(作成者: Qili のファイル) から共有されたものです。

【問題性能】

結果セットの row_number フィールドの値は移行前後で一貫性がなく、DWS での操作も移行前と一貫性がありません。

【問題分析】

この種の問題のほとんどは、PARTITION BY 列 + ORDER BY 列の組み合わせが一意ではないため、row_number() ウィンドウ関数の結果セットが不安定になることが原因です。

【解決】

PARTITION BY列+ORDER BY列の組み合わせ値が同じレコードのソートを意識しない場合は、row_number()関数の代わりにrank()関数を使用することもできます。 2; PARTITION BY 列 + ORDER BY 列の組み合わせ値に注意する場合 同じレコードを並べ替える場合は、同じグループ内のすべてのレコードの一意性を確保するために ORDER BY 列を増やす必要があります。

【事例展示】

お客様から、Oracle への移行前は次の 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'
;

前後2回の実行結果

1) 初めて実行する

2) 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 列) の値が同じ

 

クリックしてフォローして、Huawei Cloudの最新テクノロジーについて初めて学びましょう~

{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4526289/blog/9451216