tod*_*not 5 sql oracle performance oracle11g
我们在生产中有一个更新(下面),它每天处理或多或少相同的行数,但运行时间差异很大.有时几天查询会在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 );
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如上所述,LIO在每种情况下几乎保持不变,尽管由于IO等待增加,在第3天和第4天经过的时间增加,如果我的假设是正确的,则由PIO的增加引起.根据Tom Kyte的说法,调整应该专注于减少LIO而不是PIO,并且随着LIO的减少,PIO也将减少.但在这种情况下,LIO始终保持不变,但PIO的变化很大.
我的问题 - 这里可以采用什么调整策略?
小智 1
我会:
-> 检查两种情况的执行计划。-> 检查 IO 子系统的运行状况。-> 监视服务器运行的时间并确保 IO sybsystem 没有被其他进程饱和。
另外,什么样的 I/O 正在引发读取事件?顺序、并行、分散?...在这里您可以了解计划执行更新所遵循的策略...
缓冲区高速缓存是否正在调整大小?在如此大的执行过程中调整大小的小而冷的缓冲区高速缓存可能会导致需要将块读入缓冲区高速缓存才能更新它们。
基于您展示的数据的一些想法...请让我们知道结果!
| 归档时间: |
|
| 查看次数: |
498 次 |
| 最近记录: |