IT 邦德

糟糕!升级到19C后业务卡顿频发,该怎么办?

“系统升级后反而更卡了!”——这是许多DBA在将Oracle升级到19C后最头疼的问题。作为长期支持版本,19C的稳定性备受期待,但隐藏的性能杀手却可能让业务陷入卡顿泥潭。

这里小编结合一线运维经验,为你揭秘根因并提供“急救指南”!以下是前几天,现场的小伙伴迁移升级到19C之后的一次案例,出现了大面积硬解析,很多核心业务SQL执行计划变了。

Image
Image

以下是一些常见的原因及排查方法,分享给大家

1. 参数配置不当

升级后,Oracle 19C的默认参数可能与之前的版本不同,导致性能下降。例如,内存分配、并行度、优化器模式等参数可能需要调整。

-- 检查当前参数设置
SHOW PARAMETER;

-- 检查内存相关参数
SELECT * FROM v$parameter
WHERE name IN 
('memory_target', 
'memory_max_target',
'sga_target', 
'pga_aggregate_target'
);

--  自适应执行计划
optimizer_adaptive_plans参数(默认TRUE)
一般设置为FALSE,
优化器将使用固定的执行计划,不进行自适应调整。
SELECT * FROM v$parameter
WHERE name = 'optimizer_adaptive_plans';

2. 统计信息不准

升级后,表的统计信息可能未及时更新,导致执行计划选择不当,进而引发性能问题。

1.fix表统计信息收集

BEGIN
     DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
END;

2.数据字典收集
exec dbms_stats.gather_dictionary_stats(estimate_percent=>100,degree=>8,cascade=>true);

3.schema统计信息收集

exec dbms_stats.gather_schema_stats(
  ownname          => 'SCOTT',
  options          => 'GATHER AUTO'
  estimate_percent => dbms_stats.auto_sample_size,
  method_opt       => 'for all columns size repeat',
  degree           => 15,
   granularity=> 'AUTO',
   no_invalidate=> false
   force=>false
   cascade=>true,
  )

-- 检查统计信息最后更新时间
SELECT owner, table_name, last_analyzed 
FROM dba_tables 
WHERE last_analyzed IS NULL
OR last_analyzed < SYSDATE - 7;

3.资源争用

升级后,某些资源(如CPU、I/O、锁)可能成为瓶颈,导致性能卡顿。

-- 检查等待事件
SELECT event, total_waits, time_waited
FROM v$system_event
ORDER BY time_waited DESC;

-- 检查锁争用
SELECT blocking_session, sid, serial#, wait_class, event
FROM v$session
WHERE blocking_session IS NOT NULL;

-- 检查I/O性能
SELECT file_name, phyrds, phywrts, readtim, writetim
FROM v$filestat
JOIN dba_data_files ON v$filestat.file# = dba_data_files.file_id;

4.SQL执行计划变化

Oracle 19C的优化器可能生成与之前版本不同的执行计划,导致某些SQL性能下降。

-- 查找高负载SQL
SELECT sql_id, executions, elapsed_time, cpu_time, disk_reads, buffer_gets
FROM v$sql
ORDER BY elapsed_time DESC;

-- 获取SQL的执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id'));

使用SQL Profile或SQL Plan Baseline固定执行计划

-- 创建SQL Plan Baseline
DECLARE
  l_plans_loaded PLS_INTEGER;
BEGIN
  l_plans_loaded := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => '&sql_id');
END;

总结

Oracle 19C升级后性能卡顿的原因可能涉及参数配置、统计信息、执行计划、资源争用、新特性兼容性、硬件资源、对象失效、日志错误、版本Bug以及业务负载变化等多个方面。

更多内容请关注视频号 

👇👇👇👇

图片