概要: 結果セットの 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の最新テクノロジーについて初めて学びましょう~