Oracle WHERE子句(AND,OR运算符)

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

1
我不明白。你的问题是什么? - Arion
在我的WHERE子句中,AND F.NEXT_DATE = V_NEXT_BUSINESS_DATE OR F.NEXT_DATE IS NULL; 可以用另一种方式编写,我的意思是它在同一列上同时使用了AND和OR运算符。谢谢。 - ronan
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 是表中唯一的地址,因此在更新单行时它总是比索引快。如果您正在从此表中收集数据,然后在写回表之前填充变量,则可以使用此方法。
那些是您实际的模式和表名吗?如果是的话,为什么不考虑选择更具描述性的名称呢?

谢谢,由于将会有大量记录被更新,因此使用 WHERE F.CURR_DATE = V_CURR_DATE AND (F.NEXT_DATE = V_NEXT_BUSINESS_DATE OR F.NEXT_DATE IS NULL) 或仅使用 WHERE F.CURR_DATE = V_CURR_DATE AND NVL(F.NEXT_DATE, V_NEXT_BUSINESS_DATE) = V_NEXT_BUSINESS_DATE 更好,因为要更新的记录数量可能达到100000。 - ronan
抱歉 @ronan,那是一个问题吗?我怀疑使用任何一个查询都不会有太大的区别。肯定会有影响的是 _索引_。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接