4

在 Oracle SQL 中执行 where 子句时的朋友假设我有

UPDATE schema1.TBL_SCHEMA1_PROCESS_FEED F
                 SET F.TBL_SCHEMA1_PROCESS_LINE_ID      = V_LINE_ID,
                     F.TBL_SCHEMA1_PROCESS_LINE_TYPE_ID = V_LINE_TYPE_ID,
                     F.TBL_SCHEMA1_PROCESS_LINE_SUB_TYPE_ID = V_SUB_TYPE_ID,
               WHERE F.CURR_DATE = V_CURR_DATE  
               AND   F.NEXT_DATE = V_NEXT_BUSINESS_DATE OR F.NEXT_DATE IS NULL;

如何针对条件优化此代码

F.NEXT_DATE = V_NEXT_BUSINESS_DATE OR F.NEXT_DATE IS NULL
4

1 回答 1

5

那是你的实际where条款吗?你的意思是:

WHERE F.CURR_DATE = V_CURR_DATE  
  AND ( F.NEXT_DATE = V_NEXT_BUSINESS_DATE 
        OR F.NEXT_DATE IS NULL )

如果是这样,那么您需要一个索引,如果可能的话是唯一的,在curr_date.

如果您不满意这在执行时间上提供了足够大的改进,那么请考虑将其扩展为curr_date, next_date. 如果不需要,不要创建更大的索引。

你也可以考虑稍微改变你的条件,尽管我怀疑它会产生很大的不同,如果有的话。

WHERE F.CURR_DATE = V_CURR_DATE  
  AND NVL(F.NEXT_DATE, V_NEXT_BUSINESS_DATE) = V_NEXT_BUSINESS_DATE 

最好的选择是使用rowid. 如果没有更多信息,就不可能知道您是否处于可能的情况,但由于rowid它是表中的唯一地址,因此在更新单行时它总是比索引更快。如果您要从此表中收集数据,然后在写回表之前填充变量,那么这是可能的。

这些是您的实际架构和表名吗……如果是,那么为什么不考虑选择更具描述性的东西呢?

于 2012-05-05T12:05:20.323 回答