☰
Oracle 12c SQL执行监控与性能优化实战
2026/10/25 6:22:02 网站建设 项目流程

1. Oracle 12c SQL执行监控全攻略

在Oracle数据库运维中,实时监控SQL执行情况是性能调优和故障排查的基础技能。当系统出现性能瓶颈时,DBA需要快速定位问题SQL;当应用出现异常时,开发人员需要确认程序实际执行的SQL语句。本文将详细介绍Oracle 12c环境下查看历史SQL和实时SQL的完整方案,包含7种实用方法和14个实战技巧。

2. 核心监控视图解析

2.1 V$SQL与V$SQLAREA深度对比

这两个视图是监控SQL执行的基石,但设计目的不同:

  • V$SQL:存储所有共享池中的SQL语句及其执行统计信息
  • V$SQLAREA:聚合相同SQL语句的统计信息(忽略大小写和空格差异)

关键字段说明:

SELECT sql_id, -- SQL唯一标识符 executions, -- 执行次数 elapsed_time, -- 总耗时(微秒) cpu_time, -- CPU耗时 disk_reads, -- 物理读 buffer_gets, -- 逻辑读 rows_processed, -- 处理行数 sql_text -- SQL文本(前1000字符) FROM v$sql WHERE last_active_time > SYSDATE-1/24; -- 最近1小时

注意:v$sqltext存储完整SQL文本,当sql_text截断时需关联此视图

2.2 V$SESSION与V$SQLSTATS联动查询

实时监控会话执行的SQL:

SELECT s.sid, s.serial#, s.username, s.machine, q.sql_id, q.sql_text, q.executions, q.elapsed_time/1000000 "Elapsed(s)" FROM v$session s JOIN v$sql q ON s.sql_id = q.sql_id WHERE s.status = 'ACTIVE' AND s.type != 'BACKGROUND';

典型输出分析:

  • 高ELAPSED_TIME但低EXECUTIONS:可能为长事务或阻塞操作
  • 高DISK_READS:可能缺少合适索引
  • 高BUFFER_GETS:可能存在全表扫描

3. 历史SQL查询方案

3.1 AWR报告深度解析

AWR(Automatic Workload Repository)是Oracle提供的性能诊断工具,包含SQL执行历史:

  1. 生成AWR报告:
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.awr_report_text( l_dbid => (SELECT dbid FROM v$database), l_inst_num => (SELECT instance_number FROM v$instance), l_bid => (SELECT min(snap_id)-1 FROM dba_hist_snapshot WHERE begin_interval_time > SYSDATE-1), l_eid => (SELECT max(snap_id) FROM dba_hist_snapshot) ));
  1. 关键章节解读:
  • SQL ordered by Elapsed Time
  • SQL ordered by CPU Time
  • SQL ordered by Gets

3.2 ASH(Active Session History)实时分析

ASH每秒采样活动会话信息,保留时间通常为1小时:

SELECT sample_time, session_id, sql_id, event, wait_time, time_waited FROM v$active_session_history WHERE sample_time > SYSDATE-1/24 ORDER BY sample_time DESC;

4. 高级监控技巧

4.1 SQL Trace与TKPROF实战

  1. 开启10046事件跟踪:
-- 会话级跟踪 ALTER SESSION SET tracefile_identifier = 'my_trace'; ALTER SESSION SET events '10046 trace name context forever, level 12'; -- 对指定会话跟踪 EXEC DBMS_MONITOR.session_trace_enable(session_id=>123, serial_num=>456, waits=>TRUE, binds=>TRUE);
  1. 使用TKPROF解析跟踪文件:
tkprof ora_12345_my_trace.trc output.txt sys=no sort=prsela,exeela,fchela

4.2 实时SQL监控(Real-Time SQL Monitoring)

Oracle 11g引入的功能,对长时间运行的SQL自动监控:

SELECT dbms_sqltune.report_sql_monitor( sql_id => 'g8uxf5abfz7v9', type => 'TEXT', report_level => 'ALL') FROM dual;

5. 性能优化实战案例

5.1 定位高负载SQL

SELECT sql_id, executions, round(elapsed_time/1000000,2) "总耗时(s)", round(elapsed_time/decode(executions,0,1,executions)/1000000,4) "单次耗时(s)", round(buffer_gets/decode(executions,0,1,executions),2) "逻辑读/次", round(disk_reads/decode(executions,0,1,executions),2) "物理读/次", sql_text FROM ( SELECT * FROM v$sqlarea ORDER BY buffer_gets DESC ) WHERE rownum <= 10;

5.2 识别低效执行计划

SELECT p.sql_id, p.child_number, p.plan_hash_value, p.object_name, p.options, p.cost, p.cardinality FROM v$sql_plan p WHERE p.sql_id = 'g8uxf5abfz7v9' ORDER BY p.id;

6. 监控脚本集锦

6.1 实时监控脚本

SELECT s.sid, s.serial#, s.status, s.username, s.osuser, s.machine, s.program, s.module, s.action, q.sql_id, substr(q.sql_text,1,100) sql_text, q.executions, q.elapsed_time/1000000 "elapsed(s)", q.cpu_time/1000000 "cpu(s)", q.disk_reads, q.buffer_gets FROM v$session s LEFT JOIN v$sql q ON s.sql_id = q.sql_id WHERE s.type = 'USER' ORDER BY q.elapsed_time DESC NULLS LAST;

6.2 历史SQL分析脚本

SELECT h.sql_id, h.disk_reads_total, h.buffer_gets_total, h.elapsed_time_total/1000000 "elapsed(s)", s.sql_text FROM dba_hist_sqlstat h JOIN dba_hist_sqltext s ON h.sql_id = s.sql_id WHERE h.snap_id BETWEEN &begin_snap AND &end_snap ORDER BY h.disk_reads_total DESC FETCH FIRST 20 ROWS ONLY;

7. 常见问题排查

7.1 SQL文本截断问题

当SQL_TEXT被截断时,使用DBMS_LOB获取完整SQL:

SELECT sql_id, dbms_lob.substr(sql_fulltext, 4000, 1) as full_text FROM v$sqlarea WHERE sql_id = 'g8uxf5abfz7v9';

7.2 共享池刷新导致SQL丢失

配置AWR保留策略确保历史SQL不丢失:

-- 修改AWR保留时间(默认8天) EXEC DBMS_WORKLOAD_REPOSITORY.modify_snapshot_settings( retention => 43200, -- 分钟(30天) interval => 60); -- 快照间隔(分钟)

8. 安全审计方案

8.1 细粒度审计(FGA)

监控特定表的SELECT操作:

BEGIN DBMS_FGA.add_policy( object_schema => 'HR', object_name => 'EMPLOYEES', policy_name => 'AUDIT_EMP_SALARY', audit_condition => 'SALARY > 10000', audit_column => 'SALARY', handler_schema => NULL, handler_module => NULL, enable => TRUE, statement_types => 'SELECT'); END; /

查询审计结果:

SELECT timestamp, db_user, os_user, sql_text FROM dba_fga_audit_trail ORDER BY timestamp DESC;

9. 性能监控视图维护

9.1 统计信息收集策略

-- 自动统计信息收集 BEGIN DBMS_AUTO_TASK_ADMIN.enable( client_name => 'auto optimizer stats collection', operation => NULL, window_name => NULL); END; / -- 手动收集统计信息 EXEC DBMS_STATS.gather_schema_stats('SCOTT');

9.2 AWR基线管理

创建性能基线:

BEGIN DBMS_WORKLOAD_REPOSITORY.create_baseline( start_snap_id => 1234, end_snap_id => 1235, baseline_name => 'Peak Load Baseline', expiration => NULL); END; /

10. 云环境特别注意事项

在Oracle Cloud和Exadata环境中,监控需额外关注:

  • IORM资源管理对SQL执行的影响
  • Smart Scan卸载的SQL语句
  • 存储节点资源使用情况
-- 检查资源管理器配置 SELECT * FROM dba_rsrc_plans; SELECT * FROM v$rsrc_consumer_group_stats; -- Exadata特定监控 SELECT * FROM v$sqlstats WHERE io_cell_offload_eligible > 0;

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询