dbms_system.set_sql_trace_in_session

最近在学习盖总的Oracle性能优化与诊断案例精选这本书,将其中精华的部分做了实验进行实践

DBMS_SYSTEM是ORACLE提供的一个非常强大的跟踪工具之一。以下实验就是通过该工具进行跟踪、分析:

实验:
[oracle@mzf admin]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Tue Jan 3 09:55:16 2017
Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB_MZF1                       READ WRITE NO
SQL> 
SQL> alter session set container=PDB_MZF1;

Session altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDB_MZF1                       READ WRITE NO
SQL> 
SQL> 
SQL> select file_name from dba_data_files;

FILE_NAME
--------------------------------------------------
/u01/app/oracle/oradata/mzf/PDB_MZF1/system01.dbf
/u01/app/oracle/oradata/mzf/PDB_MZF1/sysaux01.dbf
 
SQL> create tablespace rosan datafile '/u01/app/oracle/oradata/mzf/PDB_MZF1/rosan01.dbf' size 500m autoextend on;

Tablespace created.

SQL> create user rosan identified by rosan default tablespace rosan;

User created.

SQL> grant dba to rosan;

Grant succeeded.

SQL> conn rosan/rosan@pdb_mzf1
Connected.
ROSAN@pdb_mzf1> 
ROSAN@pdb_mzf1> select * from tab;

no rows selected

ROSAN@pdb_mzf1> show user
USER is "ROSAN"
ROSAN@pdb_mzf1> 
ROSAN@pdb_mzf1> 
ROSAN@pdb_mzf1> create table test1(id number primary key, xid varchar2(14), xtype varchar2(1), xstatus number not null);

Table created.

ROSAN@pdb_mzf1> create index idx_t1_xid on test1(xid); 

Index created.

ROSAN@pdb_mzf1> insert into test1 values(1,'1','Y',0);

1 row created.

ROSAN@pdb_mzf1> insert into test1 values(2,'2','Y',1);

1 row created.

ROSAN@pdb_mzf1> insert into test1 values(3,'3','N',0);

1 row created.

ROSAN@pdb_mzf1> insert into test1 values(4,'4','N',1);

1 row created.

ROSAN@pdb_mzf1> insert into test1 values(5,'5','N',0);

1 row created.

ROSAN@pdb_mzf1> commit;

Commit complete.

ROSAN@pdb_mzf1> select * from test1;

        ID XID            X    XSTATUS
---------- -------------- - ----------
         1 1              Y          0
         2 2              Y          1
         3 3              N          0
         4 4              N          1
         5 5              N          0

SYS@pdb_mzf1> select sid, serial#, username from v$session where username is not null;

       SID    SERIAL# USERNAME
---------- ---------- ------------------------------
        14      40384 ROSAN
        33      50314 SYS

SYS@pdb_mzf1> exec dbms_system.set_sql_trace_in_session(14,40384,true);

PL/SQL procedure successfully completed.
 
ROSAN@pdb_mzf1> select xstatus, id, xid, xtype from test1
  2   where xid=2 and xstatus > 0;

   XSTATUS         ID XID            X
---------- ---------- -------------- -
         1          2 2              Y

SYS@pdb_mzf1> exec dbms_system.set_sql_trace_in_session(14,40384,false);

PL/SQL procedure successfully completed.
 
[oracle@mzf trace]$ ls -ltr
-rw-r----- 1 oracle oinstall    117 Jan  3 10:10 mzf_ora_19732.trm
-rw-r----- 1 oracle oinstall   5095 Jan  3 10:10 mzf_ora_19732.trc
-rw-r----- 1 oracle oinstall   1200 Jan  3 10:12 mzf_mmon_14622.trm
-rw-r----- 1 oracle oinstall  12217 Jan  3 10:12 mzf_mmon_14622.trc
......

[oracle@mzf ~]$ tkprof /u01/app/oracle/diag/rdbms/mzf/mzf/trace/mzf_ora_19732.trc /home/oracle/mzf_ora_19732.txt

TKPROF: Release 12.1.0.2.0 - Development on Tue Jan 3 10:14:37 2017
Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

[oracle@mzf ~]$ ls
Desktop  mzf_ora_19732.txt  soft
[oracle@mzf ~]$ 
[oracle@mzf ~]$ vi mzf_ora_19732.txt 
TKPROF: Release 12.1.0.2.0 - Development on Tue Jan 3 10:18:18 2017
Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Trace file: mzf_ora_19732.trc
Sort options: default

********************************************************************************
count    = number of times OCI procedure was executed
cpu      = cpu time in seconds executing
elapsed  = elapsed time in seconds executing
disk     = number of physical reads of buffers from disk
query    = number of buffers gotten for consistent read
current  = number of buffers gotten in current mode (usually for update)
rows     = number of rows processed by the fetch or execute call
********************************************************************************
select xstatus, id, xid, xtype from test1
 where xid=2 and xstatus > 0

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0         10          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0          8          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.00       0.00          0         18          0           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 104
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         1          1          1  TABLE ACCESS FULL TEST1 (cr=8 pr=0 pw=0 time=34 us cost=3 size=37 card=1)
 
SYS@pdb_mzf1> exec dbms_system.set_sql_trace_in_session(14,40384,true);

PL/SQL procedure successfully completed.

ROSAN@pdb_mzf1> select xstatus, id, xid, xtype from test1
  2   where xid='2' and xstatus > 0;

   XSTATUS         ID XID            X
---------- ---------- -------------- -
         1          2 2              Y

SYS@pdb_mzf1> exec dbms_system.set_sql_trace_in_session(14,40384,false);

PL/SQL procedure successfully completed.

[oracle@mzf trace]$ls -ltr
-rw-r----- 1 oracle oinstall    137 Jan  3 10:16 mzf_ora_19732.trm
-rw-r----- 1 oracle oinstall   7516 Jan  3 10:16 mzf_ora_19732.trc
-rw-r----- 1 oracle oinstall   1212 Jan  3 10:17 mzf_mmon_14622.trm
-rw-r----- 1 oracle oinstall  12348 Jan  3 10:17 mzf_mmon_14622.trc
......

[oracle@mzf trace]$ tkprof mzf_ora_19732.trc /home/oracle/mzf_ora_19732.txt

TKPROF: Release 12.1.0.2.0 - Development on Tue Jan 3 10:18:18 2017
Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

[oracle@mzf ~]$ ls
Desktop  mzf_ora_19732.txt  soft
[oracle@mzf ~]$ 
[oracle@mzf ~]$ vi mzf_ora_19732.txt 

select xstatus, id, xid, xtype from test1
 where xid='2' and xstatus > 0

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          3          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0          3          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.00       0.00          0          6          0           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 104
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         1          1          1  TABLE ACCESS BY INDEX ROWID BATCHED TEST1 (cr=3 pr=0 pw=0 time=17 us cost=1 size=37 card=1)
         1          1          1   INDEX RANGE SCAN IDX_T1_XID (cr=2 pr=0 pw=0 time=13 us cost=1 size=0 card=1)(object id 91791)

以上问题主要是字段类型不匹配进行了隐式转换导致了索引不被采用,产生了全表扫描的执行计划。

通常一个表达式不能包含不同的数据类型,例如一个表达式不能计算1X1之后再加上'AA',数字和字符无法进行联合的计算。然后,oracle支持显示和隐式的数据类型转换。
可以将一种数据类型转换为另一种,从而使得某些表达式的运算可以正确执行,显示转换是指通过函数明确指定的数据类型转换,而隐式转换则指未明确指定,依赖Oracle
自动进行的数据类型转换。

基于以下几个原因,Oracle推荐使用显示类型转换而不是依赖隐式转换。
(1)、使用显示转换使得SQL含义更容易被理解
(2)、隐式数据类型转换会产生负面的性能影响,尤其是当列值被转换成其他敞亮的数据类型时。
(3)、隐式转换的行为依赖每次转换时的环境如数据库参数设置等,其行为可能多变而不确定,例如将datatime值隐式转换为varchar2,这个转换的格式和NLS_DATA_FORMAT
参数有关,可能产生不可预期的结果。
(4)、隐式转换的算法会因数据库版本而不同,而显示转换则可以预期。
(5)、如果隐式转换发生在索引列,则Oracle可能用不到索引而影响性能。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30192548/viewspace-2131777/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30192548/viewspace-2131777/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值