0

昨天安装了新的 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
----------------------------

所有查询的计划都是相同的。可能是什么问题呢?

PS 我认为这可能与不同的日期 NLS 设置有关,但我们检查过它与旧服务器上的相同。

4

1 回答 1

0

正如 Gary Myers 在评论中所说,当“row_number 分析 PARTITION / ORDER BY 中的项目不是唯一的,那么不同的行可能是不同的排序取决于查询计划并且 rn=1 可能是“选择任何包含该项目的行,loc 和 action_date”。根据我们的案例,问题在于数据是错误的。

于 2021-02-17T09:22:05.047 回答