问题描述
嗨
我正在处理的Oracle数据库版本是: Oracle数据库12c企业版版本12.2.0.1.0-64位生产
它是一个有2个实例的RAC。
这是关于在实例 #1下快速运行 (15秒以下) 的查询,但在实例 #2下运行时需要10-11分钟。
查询正在按预期使用索引。
用户向我提供了查询,我通过DBA_HIST_SQLTEXT获得了其历史运行的sql_ids。
这给了我5个相同查询的sql_id在20 7月和28 7月之间运行
Observation 1:
通过以下查询,我发现较慢的运行在实例 #2上,而较快的运行在 #1上。
Observation 2:
在dba_hist_active_sess_history中,在列DELTA_INTERCONNECT_IO_BYTES下,我在实例 #2运行下发现了几个非空值,根据Oracle文档,这意味着 “在最后一个DELTA_TIME微秒内通过I/O互连发送的I/O字节数”。
在实例 #1上运行相同查询的所有其他情况下,该列的值均为NULL。
并且在ASH中有很多行用于运行较慢的sql_ids,但是运行较快的只有几行 (每行指示10s间隔)。
上面的观察是否表明实例 #2的服务器存在一些问题?
谢谢。
我正在处理的Oracle数据库版本是: Oracle数据库12c企业版版本12.2.0.1.0-64位生产
它是一个有2个实例的RAC。
这是关于在实例 #1下快速运行 (15秒以下) 的查询,但在实例 #2下运行时需要10-11分钟。
查询正在按预期使用索引。
用户向我提供了查询,我通过DBA_HIST_SQLTEXT获得了其历史运行的sql_ids。
这给了我5个相同查询的sql_id在20 7月和28 7月之间运行
select sql_id from dba_hist_sqltext where sql_text like '%CLAIMTYP%claimtype%');
Observation 1:
通过以下查询,我发现较慢的运行在实例 #2上,而较快的运行在 #1上。
select distinct h.instance_number,trunc(h.sample_time) run_date,h.sql_exec_start, h.sql_id , h.session_id, h.sql_child_number, h.sql_full_plan_hash_value,
to_char(trunc(elapsed_time_total/1000000/60/60/24),'9') || ':' ||to_char(trunc(MOD(elapsed_time_total/1000000/60/60, 24)),'09') ||':' ||
to_char(trunc(MOD(elapsed_time_total/1000000,3600)/60),'09') || ':' ||to_char(MOD(MOD(elapsed_time_total/1000000, 3600),60),'09') as "Time Taken [dd:hh:mi:ss]"
from dba_hist_active_sess_history h,DBA_HIST_SQLSTAT s
where s.sql_id=h.sql_id and h.instance_number=s.instance_number
and h.sql_id in ('73b4smcjjk38s','bt8sw7vj42sp3',........);Observation 2:
在dba_hist_active_sess_history中,在列DELTA_INTERCONNECT_IO_BYTES下,我在实例 #2运行下发现了几个非空值,根据Oracle文档,这意味着 “在最后一个DELTA_TIME微秒内通过I/O互连发送的I/O字节数”。
在实例 #1上运行相同查询的所有其他情况下,该列的值均为NULL。
并且在ASH中有很多行用于运行较慢的sql_ids,但是运行较快的只有几行 (每行指示10s间隔)。
上面的观察是否表明实例 #2的服务器存在一些问题?
谢谢。
专家解答
在RAC中,我们有 “节点亲和力” 的概念,即在完美的世界中,始终会从同一节点访问特定的数据
因为在 “刚刚启动” 的RAC系统中,在所有实例中访问数据的成本都是相同的,即,从共享磁盘读取数据。
然而,在主动运行的系统中,成本可以跨节点不同,因为从运行查询的节点的缓冲高速缓存访问数据将比从另一个节点的缓冲高速缓存访问数据更快。特别是,如果 “远程” 节点上的块有很多更改,那么远程节点上的工作负载可能会对单个节点上的查询产生影响,因为
a) 跨实例锁需要更多的协调,并且
b) 我们需要通过互连传输数据... 这增加了开销,并且
b) 可能会调用远程节点来构造块的一致读取
因此 (例如) 您可能正在节点a上运行查询,并且该节点有大量备用CPU。
另一方面,节点B被其他工作完全粉碎了。
如果对节点A的查询需要从节点B读取一致的块,那么这可能需要很长时间 (因为节点B承受压力)。
互连字节统计信息的巨大值表明正在进行大量跨节点聊天以满足该请求。
因为在 “刚刚启动” 的RAC系统中,在所有实例中访问数据的成本都是相同的,即,从共享磁盘读取数据。
然而,在主动运行的系统中,成本可以跨节点不同,因为从运行查询的节点的缓冲高速缓存访问数据将比从另一个节点的缓冲高速缓存访问数据更快。特别是,如果 “远程” 节点上的块有很多更改,那么远程节点上的工作负载可能会对单个节点上的查询产生影响,因为
a) 跨实例锁需要更多的协调,并且
b) 我们需要通过互连传输数据... 这增加了开销,并且
b) 可能会调用远程节点来构造块的一致读取
因此 (例如) 您可能正在节点a上运行查询,并且该节点有大量备用CPU。
另一方面,节点B被其他工作完全粉碎了。
如果对节点A的查询需要从节点B读取一致的块,那么这可能需要很长时间 (因为节点B承受压力)。
互连字节统计信息的巨大值表明正在进行大量跨节点聊天以满足该请求。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




