♣
题目 部分
在Oracle中,什么是SQL实时监控?
♣
答案部分
在Oracle 11g中,V$SESSION视图增加了一些新的字段,这其中包括SQL_EXEC_START和SQL_EXEC_ID,这两个字段实际上代表了Oracle 11g的一个新特性:实时的SQL监控(Real Time SQL Monitoring)。
在Oracle 11g中,当SQL并行执行时,会立即被实时监控到,或者当SQL单进程运行时,若消耗超过5秒的CPU或I/O时间,则它也会被监控到。另外,若使用/*+ monitor */提示的SQL语句,则也会被强制监控到。若使用/*+ no_monitor */提示的SQL语句则不会被监控到。监控数据被记录在V$SQL_MONITOR视图中,当然也可以通过Oracle 11g新增的包DBMS_MONITOR来主动对SQL执行监控部署。
V$SQL_MONITOR这个视图还记录了SQL的CPU_TIME以及BUFFER_GETS等重要信息,对于诊断SQL性能问题具有极大的帮助。结合V$SQL_MONITOR视图与V$SQL_PLAN_MONITOR视图可以进一步查询SQL的执行计划等信息。联合一些其它视图,如V$ACTIVE_SESSION_HISTORY、V$SESSION、V$SESSION_LONGOPS、V$SQL、V$SQL_PLAN等,可以获得关于SQL的更多信息。
V$SQL_MONITOR收集的信息每秒刷新一次,接近实时。当SQL执行完毕,信息并不会立即从V$SQL_MONITOR中删除,至少会保留1分钟。V$SQL_PLAN_MONITOR视图中的执行计划信息也是每秒更新一次,当SQL执行完毕,它们同样至少被保留1分钟。
实时SQL监控需要STATISTICS_LEVEL初始化参数设置为TYPICAL或ALL。同时CONTROL_MANAGEMENT_PACK_ACCESS参数必须是DIAGNOSTIC+TUNING(默认设置)。
可以使用如下的SQL获取文本格式的SQL报告:
1SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR('6rqxj647ut9pn') FROM DUAL ;
在有外网的情况下,可以通过如下的脚本获取HTML格式的报告:
1SET LONG 1000000 2SET LONGCHUNKSIZE 1000000 3SET LINESIZE 1000 4SET PAGESIZE 0 5SET TRIM ONS 6SET TRIMSPOOL ON 7SET ECHO OFF 8SET FEEDBACK OFF 9SPOOL report_sql_monitor.htm 10SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id=>'6rqxj647ut9pn',type=>'ACTIVE',report_level=>'ALL') AS REPORT FROM DUAL; 11SPOOL OFF
实时SQL监视通过HTML查看其监视报告时,具有更好的图形化的展示效果,它是基于Flash的展现,动态、图形画,让SQL的执行过程赏心悦目的展示出来,因此更加直观。如果监视的SQL语句发现具有全表扫描等执行计划的特征,或者CPU时间和I/O时间比较长,那么可以与SQL调优顾问接合起来,不但能获知性能瓶颈,而且能获得Oracle推荐的优化策略。