ASH采样频率由隐含参数 _ash_sampling_interval 控制,默认值1000毫秒(即每秒一次),可动态修改但需ALTER SYSTEM权限,设为0或负值将禁用采样,高频采样会加剧SGA压力与MMNL负载。
ASH采样频率由隐含参数_ash_sampling_interval控制
oracle 19c 中的 ash 默认每秒采样一次活动会话,但这不是硬编码死值,而是受隐含参数 _ash_sampling_interval 控制——单位是毫秒,典型值为 1000(即 1 秒)。该参数可动态修改,但仅限于实例级,且需具备 alter system 权限。
修改后效果立即生效,无需重启:
- 设为
500:理论采样密度翻倍,内存消耗和 SGA 压力同步上升 - 设为
2000:采样变稀疏,可能错过短时尖峰(如亚秒级锁等待) - 设为
0或负值:禁用 ASH 采样(不推荐,等于关掉实时诊断能力)
为什么不能随意调高采样频率
高频采样不是“更准”,而是“代价更高”。MMNL 进程每轮采样都要遍历所有前台会话、检查 session_state 和 event,并写入循环缓冲区。当并发会话数超 2000、或系统 CPU 已饱和时,把 _ash_sampling_interval 改成 200 可能导致:
-
v$active_session_history查询变慢甚至卡住(因缓冲区竞争加剧) - SGA 中 ASH 缓冲区(
_ash_size)更快填满,旧样本被覆盖得更早 - AWR 持久化压力增大:即使只刷 10% 样本(
_ash_disk_filter_ratio=10),原始采样量翻倍也会让WRH$_ACTIVE_SESSION_HISTORY分区写入更频繁
哪些场景真需要手动调高采样精度
日常运维完全不需要动这个参数。只有在极少数已定位到具体问题窗口、且默认采样漏掉了关键帧时,才值得临时调整:
- 复现一个持续
- RAC 环境中多个节点时间不同步,需更高频采样对齐阻塞链时间戳
- 调试 PL/SQL 执行路径时,发现
PL/SQL EXECUTION事件采样太稀疏,无法还原调用栈跳转节奏
操作前务必记录原值:SELECT ksppinm, ksppstvl FROM x$ksppi JOIN x$ksppcv USING (indx) WHERE ksppinm = '_ash_sampling_interval';,改完验证后及时恢复。
别混淆采样精度与时间字段精度
v$active_session_history.sample_time 是 TIMESTAMP(6) 类型,自带微秒级精度,但这只是存储格式——它不表示采样真的发生在那个精确时刻。实际采样时刻仍受限于 _ash_sampling_interval 的调度周期和 OS 调度延迟。常见误操作是用 WHERE sample_time = TIMESTAMP '2026-06-07 15:22:33.123456' 去查单点,结果为空;正确做法永远用范围查询,例如 sample_time BETWEEN TIMESTAMP '2026-06-07 15:22:33' AND TIMESTAMP '2026-06-07 15:22:34'。


















