昨天安装了新的 oracle 服务器。 DB 已迁移到 exadata。之前运行良好的查询突然开始显示第一次运行和后续运行的不同结果。
SELECT CASE
WHEN MAX(recommended_unit_retail) != MIN(recommended_unit_retail) THEN
item
ELSE
'-1'
END item
,MIN(recommended_unit_retail) min_ur
,MAX(recommended_unit_retail) max_ur
FROM (SELECT item
,loc
,recommended_unit_retail
,action_date
FROM (SELECT rps.item
,rps.loc
,rps.recommended_unit_retail
,rps.action_date
,row_number() over(PARTITION BY rps.item, rps.loc ORDER BY rps.action_date DESC
) rn
FROM uda_item_lov uil
JOIN xxlm_recom_prc_storage rps
ON rps.item = uil.item
AND rps.status IN ('S', 'P')
AND rps.action_date <= trunc(SYSDATE + 1)
JOIN store s
ON s.store = rps.loc
AND s.district = 1
AND s.store_open_date IS NOT NULL
AND s.store_open_date <= trunc(SYSDATE)
JOIN item_loc il
ON il.item = rps.item
AND il.loc = rps.loc
AND il.status = 'A'
WHERE uil.uda_id = 5
AND uil.uda_value != 6
AND uil.item = ANY(82584520, 82142283, 82377842))
WHERE rn = 1)
GROUP BY item;
第一次运行的数据是
---------------------
-1 | 548 | 548
-1 | 1708 | 1708
-1 | 1926 | 1926
---------------------
对于第二次和后续的运行
----------------------------
82584520 | 548 | 710
82142283 | 1708 | 1926
82377842 | 1926 | 1937
----------------------------
所有查询的计划都是一样的。可能是什么问题?
附言我认为这可能与不同的日期 NLS 设置有关,但我们进行了检查,结果与旧服务器上的情况相同。
答案 0 :(得分:0)
正如 Gary Myers 在评论中所说,当“row_number 分析 PARTITION / ORDER BY 中的项目不是唯一的,那么根据查询计划不同的行可能是不同的排序并且 rn=1 可能是'选择具有该项目、loc 和 action_date 的任何行”。 根据我们的案例,问题是数据错误。