友 在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
答案 0 :(得分:3)
这是你的实际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
是表中的唯一地址,因此总是比索引更快,更新单行时。如果您正在从此表中收集数据,然后在写回表之前填充变量,那么这将是可能的。
那些是你的实际架构和表名吗?如果它们是为什么不考虑选择更具描述性的东西呢?