【发布时间】:2014-07-29 16:01:07
【问题描述】:
我们在生产中(如下)有一个更新,它每天处理或多或少相同数量的行,但运行时却截然不同。有时查询会在 2 分钟内完成,而有时查询可能需要 20 分钟。根据我对 AWR 数据的分析,罪魁祸首是 I/O 等待时间,每当查询变慢时,缓存命中率就会由于物理读取的增加而下降。
查询本身的大纲如下:
update /*+ nologging parallel ( a 12 ) */ huge_table1 a
set col = 1
where col1 > 'A'
and col2 < 'B'
and exists ( select /*+ parallel ( b 12 ) */ 1
from huge_table2 b
where b.col3 = a.col3 );
huge_table1 和 huge_table2 包含大约 1 亿行,执行统计数据如下:
Day EXECUTIONS ELAPSED_TIME_S_1EXEC CPU_TIME_S_1EXEC IOWAIT_S_1EXEC ROWS_PROCESSED_1EXEC BUFFER_GETS_1EXEC DISK_READS_1EXEC DIRECT_WRITES_1EXEC
------- ----------- -------------------- ---------------- -------------- -------------------- ----------------- ----------------- -------------------
1 1 133.055 69.110 23.325 2178085.000 3430367.000 90522.000 42561.000
2 1 123.580 65.020 20.282 2179404.000 3341566.000 86614.000 38925.000
3 1 1212.762 72.800 1105.084 1982658.000 3131695.000 268260.000 38446.000
4 1 1085.773 59.600 996.642 1965309.000 2954480.000 200612.000 26790.000
如上所示,尽管由于 IO 等待增加,第 3 天和第 4 天经过的时间增加了,但在每种情况下,LIO 几乎保持不变,如果我的假设是正确的,那是由 PIO 增加引起的。根据 Tom Kyte 的说法,调整的重点应该是减少 LIO 而不是 PIO,随着 LIO 的减少,PIO 也会减少。但在这种情况下,LIO 始终保持不变,而 PIO 却发生了显着变化。
我的问题 - 这里可以采用什么调优策略?
【问题讨论】:
-
我不确定您在这里所说的 LIO/PIO 是什么意思,但您专注于查询和调整策略似乎很奇怪。您知道查询不是问题。根据提供的信息,我同意您的分析,您的问题是 I/O 等待。那么,为什么要等这么久呢?由于查询不是问题,可能是什么环境因素导致了这个问题?同时还有什么在运行?
-
LIO/PIO 分别是逻辑/物理读取。我已经检查过了,除了这个 UPDATE 同时运行之外,没有什么重要的(即长时间运行/等待)。
标签: sql performance oracle oracle11g