Oracle – 对索引的物理写入

我们在一张巨大的桌子上有一个大的UPDATE(影响大约200K记录)(80M记录).
由于编码错误,UPDATE使用完全相同的值重新更新同一组行(200K).

UPDATE更新的列上有一个临时索引(例如,TMP_INDX). [此列也用于WHERE子句].这个索引是“临时的”,因为它是在脚本开头创建的,并在最后删除.
现在,UPDATE作为每日批次的一部分运行,并且除了在一周中的一天之外全天都很快,其中所花费的时间比其余时间多出近10倍.
AWR显示,在更新需要大量时间的情况下,对TMP_INDX的物理写入增加了1000倍.这是AWR中唯一似乎发生变化的事情.奇怪的是,AWR显示“dbfile顺序读取”是罪魁祸首,而不是在发生这种情况时的“物理写入”.执行计划仍与其他日期相同.

鉴于上述输入,我认为缓慢的UPDATE可能是由对作为复合索引一部分的列的更新引起的对索引的物理写入增加的结果.但是,正如我之前提到的,列更新时使用完全相同的值,在这种情况下,oracle似乎执行redo optimization,它不会更新索引.我无法理解为什么这会在一周的某一天失败.有人可以对此有所启发吗?谢谢.

最佳答案
我猜想每周有一天运行一周的维护工作,这会影响强制额外读取索引的内容.您的每日批量工作是否总是在每周的同一天长时间运行?如果是这样,请查看视图dba_scheduler_jobs和dba_scheduler_schedules以查看是否已安排任何作业.

现在更大的问题是,为什么不修复UPDATE语句以包含标准以避免更新值已经是正确值的行?

转载注明原文:Oracle – 对索引的物理写入 - 代码日志