减少查询的缓冲区高速缓存命中会导致随机性能问题

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 正在引发读取事件?顺序、并行、分散?...在​​这里您可以了解计划执行更新所遵循的策略...

缓冲区高速缓存是否正在调整大小?在如此大的执行过程中调整大小的小而冷的缓冲区高速缓存可能会导致需要将块读入缓冲区高速缓存才能更新它们。

基于您展示的数据的一些想法...请让我们知道结果!