【发布时间】:2017-12-01 21:38:45
【问题描述】:
我有以下更新声明
UPDATE CONTRACTSF CF
SET CF.PAYDATE = (SELECT MAX(FLHTEMP.PAYDATE)
FROM FLHTEMP
WHERE
FLHTEMP.FLHDATE = CF.FLHDATE
AND FLHTEMP.FLHCOD = CF.FLHCOD
AND FLHTEMP.FLHUN = CF.FLHUN
AND FLHTEMP.FLHCONTRACT = CF.FLHCONTRACT)
WHERE CF.FLHUN || CF.FLHCONTRACT || CF.FLHDATE
IN (SELECT DISTINCT FT.FLHUN || FT.FLHCONTRACT || FT.FLHDATE
FROM FLHTEMP FT)
当 FLHTEMP 表有很多记录(6M 记录)时,需要很多小时才能完成。
我尝试过将 IN 与多列一起使用,而不是将其与 || 连接。但没有区别。
我为所有正在使用的列(FLHUN、FLHCONTRACT、FLHCOD、FLHDATE)创建了一个索引,但 Plan explain 显示它没有被使用。
Plan explain 中显示的昂贵操作是 Hash Join、Sort Unique 和 Table full access
【问题讨论】:
-
SELECT DISTINCT ...对IN (...)表达式没有用处。试试WHERE (CF.FLHUN, CF.FLHCONTRACT, CF.FLHDATE) IN (SELECT FT.FLHUN, FT.FLHCONTRACT, FT.FLHDATE FROM ...) -
我已经试过了,但性能是一样的
-
如果没有其他工作(索引等),那么我建议您在两个表中添加一个新列,该列将存储此连接值
CF.FLHUN || CF.FLHCONTRACT || CF.FLHDATE。尝试先将该列添加到一个表中,如果仍然没有显着改进,则将其添加到另一个表中。基本上,这将节省 Oracle 进行连接,然后将其存储在某处以在两个表上进行比较。