oracle 数据库客户端(会话)跟踪操作语句

方法一

启动开启会话监听:

alter session set statistics_level=all;

跟踪出来的sql 语句:

select  *  from   v$sql  order   by   first_load_time desc ;

解析:

V$SQL 的说明
    V$SQL 在子游标的级别上列出了在共享区域(shared pool)中的 SQL 语句的统计信息,子游标通过 SQL_ID 和 Child_Number 标识。V$SQL 中的视图信息一般在 SQL 执行的最后进行更新。然而,对于长时间执行的 SQL,每5秒会更新一次 v$SQL 视图

SQL_TEXT    当子前游标的SQL文本的前一千个字符 
SQL_FULLTEXT    以CLOB类型存储的当前游标的SQL文本的所有字符
SQL_ID    当前子游标的父游标即 SQL 语句在 Library Cache 中的标识符   
SHARABLE_MEM    子游标使用的共享内存量(字节)      
PERSISTENT_MEM    用于子游标生存期的固定内存量(字节)
RUNTIME_MEM    在执行子游标期间需要的固定内存量
SORTS    为此子游标完成的排序次数 
LOADED_VERSIONS    指示上下文堆是否加载(1)或不加载(0)
OPEN_VERSIONS    指示子游标是否被锁定(1)或不(0)
USERS_OPENING    打开任何子游标的用户数量          
FETCHES    与SQL语句关联的提取数量 
EXECUTIONS    该对象自被载入库缓存(Library Cache)后执行的次数
PX_SERVERS_EXECUTIONS    以并行方式执行的总次数(0当语句从未并行执行时)
END_OF_FETCH_COUNT    自光标被引入库缓存后,此游标完全执行的次数
USERS_EXECUTING    执行语句的用户数      
LOADS    对象加载或重新加载的次数 
FIRST_LOAD_TIME    父创建时间的时间戳       
INVALIDATIONS    此子游标已失效的次数     
PARSE_CALLS    这个子游标的解析调用次数  
DISK_READS    此子游标的磁盘读取次数 
DIRECT_WRITES    这个子游标的直接写入次数
BUFFER_GETS    此子游标的缓存区读取的次数
APPLICATION_WAIT_TIME    应用程序等待时间(微秒)
CONCURRENCY_WAIT_TIME    并发等待时间(微秒)
CLUSTER_WAIT_TIME    集群等待时间(微秒)
USER_IO_WAIT_TIME    用户I/O等待时间(微秒)
PLSQL_EXEC_TIME    PL/SQL执行时间(微秒)
JAVA_EXEC_TIME    Java执行时间(微秒)
ROWS_PROCESSED    解析的SQL语句返回的总行数
COMMAND_TYPE    Oracle命令类型定义
OPTIMIZER_MODE    执行SQL语句的模式
OPTIMIZER_COST    优化器给出的这个查询的代价
OPTIMIZER_ENV    优化器环境
OPTIMIZER_ENV_HASH_VALUE    优化器环境的哈希值
PARSING_USER_ID    最初构建此子游标的用户的用户标识
PARSING_SCHEMA_ID    最初用来构建这个子游标的模式ID
PARSING_SCHEMA_NAME    用于最初构建此子游标的架构名称
KEPT_VERSIONS    指示是否使用该DBMS_SHARED_POOL包将此子游标标记为保留在库缓存中
ADDRESS    该游标的父级句柄的地址
TYPE_CHK_HEAP    这个子游标的类型检查堆的描述符
HASH_VALUE    库缓存(Library Cache)中父游标对应SQL语句的散列值
OLD_HASH_VALUE    旧的SQL哈希值
PLAN_HASH_VALUE    此游标的SQL计划的哈希值。比较两个计划是否相同可用该字段 
CHILD_NUMBER    这个子游标的编号
SERVICE    服务的名称
SERVICE_HASH    服务名称的Hash值
MODULE    首次分析SQL语句时执行的模块名称;通过调用DBMS_APPLICATION_INFO.SET_MODULE设置
MODULE_HASH    模块名称的散列值
ACTION    首次分析SQL语句时执行的操作名称;通过调用DBMS_APPLICATION_INFO.SET_ACTION设置
ACTION_HASH    操作名称的散列值
SERIALIZABLE_ABORTS    事务未能序列化产生ORA-08177错误的次数
OUTLINE_CATEGORY    如果在构建游标期间应用了Outline,则此列将为Outline的类别。否则该列留空
CPU_TIME    此游标用于解析/执行/获取的CPU使用时间(微秒)
ELAPSED_TIME    该游标用于解析/执行/获取的等待时间(微秒)
OUTLINE_SID    Outline Session的标识符
CHILD_ADDRESS    子游标的地址
SQLTYPE    表示用于此语句的SQL语言的版本
REMOTE    指示游标是否为远程映射(Y)或不(N)
OBJECT_STATUS    游标状态
LITERAL_HASH_VALUE    用系统生成的绑定变量替换的文本的散列值;如果CURSOR_SHARING未使用,则值为0  
LAST_LOAD_TIME    查询计划加载到库缓存(Library Cache)中的时间
IS_OBSOLETE    指示游标是否已过时(Y)或不(N);如果子游标的数量太大,就会发生这种情况
LAST_ACTIVE_TIME    时间查询计划上次处于活动状态
TYPECHECK_MEM    TypeCheck内存
IO_INTERCONNECT_BYTES    Oracle数据库与存储系统之间交换的I/O字节数
LOCKED_TOTAL    子游标被锁定的总次数
PINNED_TOTAL    子游标被锁定的总次数


V$SQLAREA 的说明 
    V$SQLAREA中列出的也是在共享区域(Shared Pool)中的 SQL 语句的统计信息,且其中的字段和 v$SQL 基本一致,不同的是 V$SQLAREA 是在父游标级别上做出的汇总统计,相当于对 v$SQL 进行了 group by SQL_ID 的汇总

SQL_TEXT    当前游标的SQL文本的前一千个字符
SQL_FULLTEXT    以CLOB类型存储的当前游标的SQL文本的所有字符
SQL_ID    当前子游标的父游标即 SQL 语句在 Library Cache 中的标识符
SHARABLE_MEM    所有子游标使用的所有共享内存的总和
PERSISTENT_MEM    所有子游标的生命周期使用的固定内存总和
RUNTIME_MEM    执行所有子游标期间所需的所有内存的固定总和
SORTS    为所有子游标完成的排序总数
VERSION_COUNT    此父级下的缓存中存在的子游标数
LOADED_VERSIONS    缓存中存在的子游标数,并加载其上下文堆
OPEN_VERSIONS    当前在当前父级下打开的子游标数
USERS_OPENING    打开任何子游标的用户数量
FETCHES    与SQL语句关联的提取数量
EXECUTIONS    总计执行次数,总计在所有子游标上
PX_SERVERS_EXECUTIONS    并行执行服务器执行的总执行次数(0当语句从未并行执行时)
END_OF_FETCH_COUNT    自游标被载入库缓存(Library Cache)后,此游标完全执行的次数
USERS_EXECUTING    在所有子游标上执行语句的用户总数
LOADS    对象加载或重新加载的次数
FIRST_LOAD_TIME    父游标创建时间的时间戳
INVALIDATIONS    所有子游标的失效总数
PARSE_CALLS    解析调用该游标的所有子游标的总和
DISK_READS    所有子游标上磁盘读取次数的总和
DIRECT_WRITES    在所有子游标上直接写入的总数
BUFFER_GETS    所有子游标上缓存区读取次数的总和
APPLICATION_WAIT_TIME    应用程序等待时间(微秒)
CONCURRENCY_WAIT_TIME    并发等待时间(微秒)
CLUSTER_WAIT_TIME    集群等待时间(微秒)
USER_IO_WAIT_TIME    用户I/O等待时间(以微秒为单位)
PLSQL_EXEC_TIME    PL/SQL执行时间(微秒)
JAVA_EXEC_TIME    Java执行时间(微秒)
ROWS_PROCESSED    代表此SQL语句处理的总行数
COMMAND_TYPE    Oracle命令类型定义
OPTIMIZER_MODE    执行SQL语句的模式
OPTIMIZER_COST    优化器给出的这个查询的代价
OPTIMIZER_ENV    优化器环境
OPTIMIZER_ENV_HASH_VALUE    优化器环境的哈希值
PARSING_USER_ID    已解析此父级下的第一个游标的用户的用户标识
PARSING_SCHEMA_ID    用于分析此子游标的模式ID
PARSING_SCHEMA_NAME    用于分析此子级游标的模式名称
KEPT_VERSIONS    使用DBMS_SHARED_POOL软件包标记为保留的子游标的数量
ADDRESS    该游标的父级句柄的地址
HASH_VALUE    库缓存中父语句的散列值
OLD_HASH_VALUE    旧的SQL哈希值
PLAN_HASH_VALUE    此游标的SQL计划的数字表示。比较两个计划是否相同可用该字段
MODULE    首次分析SQL语句时执行的模块名称,通过调用DBMS_APPLICATION_INFO.SET_MODULE设置
MODULE_HASH    模块名称的哈希值
ACTION    首次分析SQL语句时执行的操作名称,通过调用DBMS_APPLICATION_INFO.SET_ACTION设置
ACTION_HASH    操作名称的哈希值
SERIALIZABLE_ABORTS    在所有子游标中事务未能序列化产生ORA-08177错误的次数的总和
OUTLINE_CATEGORY    如果在构建游标期间应用了Outline,则此列将为Outline的类别。否则该列留空
CPU_TIME    此游标用于解析/执行/获取的CPU使用时间(以微秒为单位)
ELAPSED_TIME    该游标用于解析/执行/获取的等待时间(以微秒为单位)
OUTLINE_SID    Outline Session的标识符
LAST_ACTIVE_CHILD_ADDRESS    在所有的子游标中最后一个活动的即最后更新V$SQL的子游标的地址标识
REMOTE    指示游标是否为远程映射(Y)或不(N)
OBJECT_STATUS    游标的状态
LITERAL_HASH_VALUE    用系统生成的绑定变量替换的文本的散列值;如果CURSOR_SHARING未使用,则值为0  
LAST_LOAD_TIME    查询计划加载到库库缓存(Library Cache)中的时间
IS_OBSOLETE    指示游标是否已过时(Y)或不(N)。如果子游标的数量太大,就会发生这种情况。
LAST_ACTIVE_TIME    查询计划上次处于活动状态的时间
TYPECHECK_MEM    Typecheck内存
IO_INTERCONNECT_BYTES    Oracle数据库与存储系统之间交换的I/O字节数
LOCKED_TOTAL    所有子游标被锁定的总次数
PINNED_TOTAL    所有子游标被锁定的总次数  


V$SQLSTATS 的说明
    V$SQLSTATS 显示 SQL 游标的基本性能统计信息,并且每个 SQL 语句包含一行(即每个 SQL_ID 的唯一值一行)。 V$SQLSTATS 中的列的列定义与 V$SQL 和 V$SQLAREA 视图中的列定义相同。但是,V$SQLSTATS 视图与 V$SQL 和 V$SQLAREA 不同,因为它更快,更具可扩展性并具有更高的数据保留(即使游标已经超出共享池,统计信息仍可能出现在此视图中)。 请注意,V$SQLSTATS 包含出现在 V$SQL 和 V$SQLAREA 中的列的子集

SQL_TEXT     当前游标的SQL文本的前一千个字符
SQL_FULLTEXT    以CLOB类型存储的当前游标的SQL文本的所有字符
SQL_ID    当前子游标的父游标即 SQL 语句在 Library Cache 中的标识符
LAST_ACTIVE_TIME    最后一次更新游标统计信息的时间
LAST_ACTIVE_CHILD_ADDRESS    最后一次更新游标统计信息的子游标的地址
PLAN_HASH_VALUE    此游标的SQL计划的哈希值;比较两个计划是否相同可以使用该字段
PARSE_CALLS    使用此SQL文本和计划的所有游标的解析调用数量
DISK_READS    使用此SQL文本和计划的所有游标的磁盘读取次数
DIRECT_WRITES    使用此SQL文本和计划的所有游标的直接写入次数
BUFFER_GETS    使用此SQL文本和计划的所有游标的读取内存次数
ROWS_PROCESSED    解析的SQL语句返回的总行数
SERIALIZABLE_ABORTS    事务未能序列化产生ORA-08177错误的次数
FETCHES    与SQL语句关联的提取数量
EXECUTIONS    该游标被载入库缓存(Library Cache)后执行的次数
END_OF_FETCH_COUNT    自游标被载入库缓存(Library Cache)后,此游标完全执行的次数
LOADS    游标被加载或重新加载的总次数
VERSION_COUNT    使用此SQL文本和计划的所有存在于缓存中的子游标数量
INVALIDATIONS    此游标的子游标已失效的次数
PX_SERVERS_EXECUTIONS    并行执行服务器执行的总执行次数(0当语句从未并行执行时)
CPU_TIME    此游标用于解析/执行/获取的CPU使用时间(微秒)
ELAPSED_TIME    该游标用于解析/执行/获取的已使用时间(微秒)
AVG_HARD_PARSE_TIME    该游标用于解析/执行/获取的平均硬解析时间(微秒)
APPLICATION_WAIT_TIME    应用程序等待时间(微秒)
CONCURRENCY_WAIT_TIME    并发等待时间(微秒)
CLUSTER_WAIT_TIME    等待OracleRAC集群资源所花费的累积等待的总时间(微秒)
USER_IO_WAIT_TIME    用户I/O等待时间(微秒)
PLSQL_EXEC_TIME    PL/SQL执行时间(微秒)
JAVA_EXEC_TIME    Java执行时间(微秒)
SORTS    为子游标完成的排序次数
SHARABLE_MEM    此SQL文本和计划当前由所有游标占用的共享内存总量(字节)
TOTAL_SHARABLE_MEM    所有使用此SQL文本的游标都完全加载要占用的共享内存(字节)


V$SQL_PLAN 的说明
    V$SQL_PLAN 中包含加载到库缓存中的每个子游标的执行计划信息

ADDRESS     该游标的父级句柄的地址
HASH_VALUE    库缓存中父语句的散列值;可以使用ADDRESS和HASH_VALUE列关联V$SQLAREA表
SQL_ID    库缓存中父游标的SQL标识符
PLAN_HASH_VALUE    该游标的执行计划的Hash值。比较两个计划是否相同可以使用该字段
CHILD_ADDRESS    该子游标的地址
CHILD_NUMBER    该子游标的编号;可以使用ADDRESS、HASH_VALUE和CHILD_NUMBER三列关联V$SQL表
TIMESTAMP    生成这个子游标的执行计划的时间戳
OPERATION    在这个步骤中执行的内部操作的名称
OPTIONS    描述OPERATION列的操作变化
OBJECT_NODE    用于引用对象的数据库链接的名称
OBJECT#    表或索引的标识号
OBJECT_OWNER    拥有包含表或索引的Schema的用户的名称
OBJECT_NAME    表或索引的名称
OBJECT_ALIAS    对象的别名
OBJECT_TYPE    对象的类型
OPTIMIZER    计划中第一行的优化模式
ID    分配给执行计划中每个步骤的编号
PARENT_ID    对当前步骤的输出进行下一个执行步骤的ID
DEPTH    树中操作的深度
POSITION    所有具有相同PARENT_ID的操作的处理顺序
SEARCH_COLUMNS    带有启动和停止键的索引列
COST    根据优化器基于成本的方法估算的操作成本
CARDINALITY    通过基于成本的优化器估计操作产生的行数
BYTES    通过基于成本的优化器估计操作产生的字节数
OTHER    其他特定的执行步骤的信息
OTHER_TAG    介绍该OTHER列的内容
PARTITION_START    范围存取分区中的开始分区
PARTITION_STOP    范围存取分区中的开始分区
PARTITION_ID    计算PARTITION_START和PARTITION_STOP列的值的步数
DISTRIBUTION    存储用于将生产者查询服务器的行分配给使用者查询服务器的方法
CPU_COST    根据优化器的基于成本的方法估算的操作的CPU成本;基于规则的方法的语句列为空
IO_COST    根据优化器基于成本的方法估算的操作的I/O成本;基于规则的方法的语句列为空
TEMP_SPACE    根据优化器基于成本的方法估算的操作临时空间大小;基于规则的方法的语句列为空
ACCESS_PREDICATES    用于在访问结构中定位的列
FILTER_PREDICATES    用于在生成数据前过滤的列
PROJECTION    操作产生的表达式
TIME    按照优化程序的基于成本的方法估算的操作的经过时间;基于规则的方法的语句列为空
QBLOCK_NAME    查询块的名称
REMARKS    备注
OTHER_XML    提供特定于执行计划执行步骤的额外信息  


V$SESSION 的说明  
    V$SESSION 显示每个当前会话的会话信息。每一个连接到数据库实例中的Session都拥有一条记录,包括用户Session及后台进程如DBWR,LGWR,Arcchiver等   

SADDR    会话地址
SID    会话标识符
SERIAL#    会话序列号。用于在SID被重用时唯一标识一个会话对象
AUDSID    审计会话ID
PADDR    拥有会话的进程的地址;关联v$process的addr字段可以查询到进程对应的Session
USER#    会话的用户标识符;同于dba_users中的user_id,Oracle内部进程user#为0 
USERNAME    会话的用户名;等于dba_users中的username,Oracle内部进程的username为空 
COMMAND    正在执行的SQL语句(最后解析的语句) 
OWNERID    用于会话迁移、并行等拥有可迁移会话的用户的标识符;值为2147483644时无效
TADDR    交易状态对象的地址 
LOCKWAIT    标识当前会话是否处于锁等待的状态;非空为等待的锁的地址,空表示无等待
STATUS    会话状态:ACTIVE-正在执行SQL;INACTIVE-不活动;KILLED-标记为被杀
SERVER    服务器类型 
SCHEMA#    架构标识符;Oracle内部进程的schema#为0 
SCHEMANAME    架构名称;Oracle内部进程的为sys
OSUSER    操作系统客户端用户名 
PROCESS    操作系统客户端进程ID 
MACHINE    操作系统机器名称 
PORT    客户端端口号 
TERMINAL    操作系统终端名称 
PROGRAM    操作系统程序名称 
TYPE    会话类型 
SQL_ADDRESS    与SQL_HASH_VALUE一起用于标识当前正在执行的SQL语句 
SQL_HASH_VALUE    与SQL_ADDRESS一起使用来标识当前正在执行的SQL语句 
SQL_ID    当前正在执行的SQL语句的SQL标识符 
SQL_CHILD_NUMBER    当前正在执行的SQL语句的子游标编号 
SQL_EXEC_START    此会话当前执行的SQL执行的时间;如果SQL_ID为NULL,则为NULL 
SQL_EXEC_ID    SQL执行标识符;如果SQL_ID为NULL或者该SQL的执行尚未开始则为NULL
PREV_SQL_ADDR    与PREV_HASH_VALUE一起使用以标识最后执行的SQL语句 
PREV_HASH_VALUE    与PREV_SQL_ADDR一起用于标识最后执行的SQL语句 
PREV_SQL_ID    执行的最后一条SQL语句的SQL标识符 
PREV_CHILD_NUMBER    最后执行的SQL语句的子游标编号 
PREV_EXEC_START    最后执行的SQL语句的开始执行时间 
PREV_EXEC_ID    最后执行的SQL语句的SQL执行标识符 
PLSQL_ENTRY_OBJECT_ID    堆栈中最上面的PL/SQL子程序的对象ID;如果堆栈中没有PL/SQL子程序则为NULL 
PLSQL_ENTRY_SUBPROGRAM_ID    堆栈中最上面的PL/SQL子程序的子程序ID;如果堆栈中没有PL/SQL子程序则为NULL 
PLSQL_OBJECT_ID    当前正在执行的PL/SQL子程序的对象ID;如果执行SQL,则为NULL 
PLSQL_SUBPROGRAM_ID    当前正在执行的PL/SQL对象的子程序ID;如果执行SQL,则为NULL 
MODULE    通过调用DBMS_APPLICATION_INFO.SET_MODULE过程设置的当前正在执行的模块名称 
MODULE_HASH    MODULE列的哈希值 
ACTIONFootref1    通过调用DBMS_APPLICATION_INFO.SET_ACTION过程设置的当前正在执行的操作名称 
ACTION_HASH    ACTION列的哈希值 
CLIENT_INFO    由DBMS_APPLICATION_INFO.SET_CLIENT_INFO程序设置的信息 
FIXED_TABLE_SEQUENCE    当Session完成一次对数据库的调用后就会增加的一个数值
ROW_WAIT_OBJ#    当前被锁定的行所在表的对象标识;和DBA_OBJECT的OBJECT_ID得到被锁定的TABLE NAME
ROW_WAIT_FILE#    当前被锁定的行所在的数据文件的标识符
ROW_WAIT_BLOCK#    当前被锁定的行所在的块的标识符;
ROW_WAIT_ROW#    当前被锁定的行。只当会话正等另一事务提交且ROW_WAIT_OBJ#值不为-1时此列才有效
LOGON_TIME    登录时间 
LAST_CALL_ET    当前会话状态为ACTIVE/INACTIVE的保持时间(秒) 
RESOURCE_CONSUMER_GROUP    会话的当前资源使用者的组的名称 
PDML_STATUS    ENABLED时会话为PARALLEL DML模式;DISABLED则不支持;FORCED则强制为该模式
PDDL_STATUS    ENABLED时会话为PARALLEL DDL模式;DISABLED则不支持;FORCED则强制为该模式
PQ_STATUS    ENABLED时会话为PARALLEL QUERY模式;DISABLED则不支持;FORCED则强制为该模式
CURRENT_QUEUE_DURATION    会话当前的排队时间量
CLIENT_IDENTIFIER    会话的客户端标识符 
BLOCKING_SESSION_STATUS    是否存在阻止会话的详细信息 
BLOCKING_INSTANCE    阻塞会话的实例标识符;只有BLOCKING_SESSION_STATUS的值为VALID时才有效
BLOCKING_SESSION    阻塞会话的会话标识符;只有BLOCKING_SESSION_STATUS的值为VALID时才有效 
SEQ#    一个唯一标识当前或最后一次等待(每次等待增加)的数字 
EVENT#    活动编号 
EVENT    会话正在等待的资源或事件 
WAIT_CLASS_ID    等待事件的类的标识符 
WAIT_CLASS#    等待事件的类的数值 
WAIT_CLASS    等待事件的类的名称 
WAIT_TIME_MICRO    当前等待或者上次等待的等候的时间(微秒) 
TIME_SINCE_LAST_WAIT_MICRO    自上次等待结束以来的时间(微秒);如果会话当前正在等待,则值为0 
SERVICE_NAME    会话的服务名称 
SQL_TRACE    指示是否启用SQL跟踪(ENABLED)或禁用(DISABLED) 
SQL_TRACE_WAITS    指示是否启用等待跟踪(TRUE)或不(FALSE) 
SQL_TRACE_BINDS    指示是否启用绑定跟踪(TRUE)或不(FALSE) 
SQL_TRACE_PLAN_STATS    在每个游标的跟踪文件中转储行源统计信息的频率: 
SESSION_EDITION_ID    显示在会话中将被报告的值sys_context('USERENV','SESSION_EDITION_ID')
CREATOR_ADDR    创建过程或电路的地址 
CREATOR_SERIAL#    创建过程或电路的序列号 
ECID    执行上下文的标识符(由ApplicationServer发送)


                                                                                                                                                           

方法二

一、什么是跟踪文件?

跟踪文件中包含了大量而详细的诊断和调试信息。通过对跟踪文件的解读和分析,我们可以定位问题、分析问题和解决问题。从跟踪文件的产生的来源来看,跟踪文件又可以分为两类:一类是数据库的操作人员有意生成的;另一类则是由于出现了异常错误,由数据库自动生成的。对于后一类,只对Oracle内部的技术支持人员是有用的,但对于我们,则多半看不懂。前一类,则是我们经常用到的,帮助我们分析、调整和优化应用性能,处理并解决问题。

那么在哪里可以找到跟踪文件呢?通过查询数据字典v$diag_info可以确定跟踪文件的存储路径,如下所示。

1

select * from v$diag_info;

进入目录/u01/app/oracle/diag/rdbms/orcl/orcl/trace可以看到以trc为后缀的跟踪文件,如下图所示。

二、跟踪文件的命名规则

一个跟踪文件的名字一般由以下几部分组成:

  • ORACLE_SID
  • 固定字符
  • 服务器的进程ID号
  • 文件后缀名 .trc
  • 各部分之间以下划线连接。

例如:orcl_mmon_12210.trc,其中:“orcl" 是本环境下数据库的SID,"12210"为产生该跟踪文件会话所使用的服务器进程ID号。如何知道我的ORACLE_SID和会话所使用的服务器进程ID呢?

三、如何确定跟踪文件?

为了演示的方便,我们给一个普通用户scott授予dba的角色。

1、使用管理登录,并授予scott授予dba的角色

1

2

3

4

5

6

7

[oracle@oracle12c ~]$ sqlplus / as sysdba

SQL> grant dba to scott;

Grant succeeded.

SQL>

2、确定Oracle SID,如下所示。这里的SID就是:orcl

1

2

3

4

5

6

7

SQL> select instance_name from V$instance;

INSTANCE_NAME

----------------

orcl

SQL>

3、切换到scott用户,并确定会话ID

1

2

3

4

5

6

7

8

9

SQL> conn scott/tiger

Connected.

SQL> select sid from v$mystat where rownum=1;

       SID

----------

    70

SQL>

4、根据会话ID,确定会话的地址信息

1

2

3

4

5

6

7

SQL> select paddr from v$session where sid=70;

PADDR

----------------

000000006DAB6588

SQL>

5、根据会话的地址信息,确定操作系统的进程号

1

2

3

4

5

6

7

SQL> select spid from v$process where addr='000000006DAB6588';

SPID

------------------------

54685

SQL>

进入目录/u01/app/oracle/diag/rdbms/orcl/orcl/trace会发现,此时并不存在包含54685的跟踪文件,原因是要使用跟踪文件需要手动开启会话的跟踪。

6、开启会话的跟踪

1

2

3

4

5

SQL> alter session set sql_trace=true;

Session altered.

SQL>

7、执行一条简单的SQL语句,并检查/u01/app/oracle/diag/rdbms/orcl/orcl/trace目录,这时候就可以看到生成的跟踪文件。

1

2

3

4

5

[oracle@oracle12c trace]$ pwd

/u01/app/oracle/diag/rdbms/orcl/orcl/trace

[oracle@oracle12c trace]$ ls *54685.trc

orcl_ora_54685.trc

[oracle@oracle12c trace]$

四、使用跟踪文件诊断SQL

根据跟踪对于诊断SQL语句是非常有用的,下面通过一个简单的示例来说明。

1、执行下面的的SQL语句

1

2

3

4

5

select * from scott.emp where deptno=10;

select * from scott.emp where deptno=20;

select * from scott.emp where deptno=30;

这三条SQL分别查询10、20和30号部门的员工。通过观察发现,这三条SQL除了where的条件的参数值不一样,其他部分都是一样的。这样的SQL语句叫做“重复的SQL”。如果数据库中存在大量的重复SQL,会使得每次在执行的时候都会进行SQL的解析,再生成执行计划。从而影响数据库的性能。

下面通过跟踪文件来验证上面的结论。

2、由于前面开启了会话的跟踪,如果不再需要进行跟踪了,需要手动关闭一下。

1

2

3

4

5

SQL> alter session set sql_trace=false;

Session altered.

SQL>

3、使用tkprof工具格式化跟踪文件

1

2

3

4

5

6

[oracle@oracle12c trace]$ tkprof orcl_ora_54685.trc /home/oracle/a.txt sys=no sort=fchela

TKPROF: Release 12.2.0.1.0 - Development on Mon Jun 28 10:37:48 2021

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

[oracle@oracle12c trace]$

4、查看生成的a.txt文件,如下所示:

1

2

3

4

5

6

7

8

9

10

11

SQL ID: 1mvxd868z75nf Plan Hash: 3956160932

select *

from scott.emp where deptno=30

SQL ID: 2nbac4n9hnzth Plan Hash: 3956160932

select *

from scott.emp where deptno=20

SQL ID: 062r5atccuyv4 Plan Hash: 3956160932

select *

from scott.emp where deptno=10

可以看成尽管三条SQL对应的SQL ID不一样,但是生成的Plan Hash是一样的。这就说明这三条SQL的执行计划是一样的。既然如此,我们可以使用绑定变量的方式来改写这三条SQL。让这三条SQL语句在执行的时候,不用每次都生成执行计划。只需要复用第一次生成的执行计划即可。从而提高性能。

以上就是使用Oracle的跟踪文件的详细内容,更多关于Oracle跟踪文件的资料请关注脚本之家其它相关文章!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chafferer,迷心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值