ITPub博客

首页 > 数据库 > Oracle > [20201207]12c v$open_cursor视图.txt

[20201207]12c v$open_cursor视图.txt

原创 Oracle 作者:lfree 时间:2020-12-07 09:03:49 0 删除 编辑

[20201207]12c v$open_cursor视图.txt

--//12cv$open_cursor视图定义与11g有点不同,通过测试说明问题.注我使用18c,并不影响测试结果。

1.环境:
TTT@192.168.X.X:1521/orcl> select BANNER from v$version ;
BANNER
----------------------------------------------------------------------
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
--//测试使用18c也是一样的。

2.测试:
--//session 1:
TTT@192.168.X.X:1521/orcl> @ spid
       SID    SERIAL# PROCESS SERVER             SPID       PID  P_SERIAL# C50
---------- ---------- ------- ------------------ ------ ------- ---------- --------------------------------------------------
       395      21260 32697   DEDICATED          28776       43     163433 alter system kill session '395,21260' immediate;

TTT@192.168.X.X:1521/orcl> select * from dept where deptno=10;
    DEPTNO DNAME                        LOC
---------- ---------------------------- --------------------------
        10 ACCOUNTING                   NEW YORK
--//执行5次以上.

TTT@192.168.X.X:1521/orcl> @ tpt/hash
HASH_VALUE SQL_ID                     CHILD_NUMBER HASH_HEX
---------- -------------------------- ------------ ------------------
 911274289 4xamnunv51w9j                         0  3650f131

--//session 2:
SYS@192.168.X.X:1521/orcl> select * from v$open_cursor where sid=395 and sql_id='4xamnunv51w9j'
  2  @ prxx
==============================
SADDR                         : 00000000924558D0
SID                           : 395
USER_NAME                     : TTT
ADDRESS                       : 00000001064A04D8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HASH_VALUE                    : 911274289
SQL_ID                        : 4xamnunv51w9j
SQL_TEXT                      : select * from dept where deptno=10
LAST_SQL_ACTIVE_TIME          : 2020-12-07 08:47:28
SQL_EXEC_ID                   :
CURSOR_TYPE                   : SESSION CURSOR CACHED
CHILD_ADDRESS                 : 00000000E5D4F420
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CON_ID                        : 3
PL/SQL procedure successfully completed.
--//注意看下划线,增加了CHILD_ADDRESS,CON_ID列。

SYS@192.168.X.X:1521/orcl> @ sharepool/shp4 4xamnunv51w9j 0
TEXT                  KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03                     KGLOBT09
--------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- -------------------------- ----------
child handle address  00000000E5D4F420 00000001064A04D8 select * from dept where deptno=10                1          0          0 0000000076F94EE0 00000000BFBB9948       4072      16200       3219     23491      23491  911274289 4xamnunv51w9j                       0
parent handle address 00000001064A04D8 00000001064A04D8 select * from dept where deptno=10                1          0          0 0000000100C653E0 00                     4072          0          0      4072       4072  911274289 4xamnunv51w9j                   65535
--//上面查询v$open_cursor的CHILD_ADDRESS :00000000E5D4F420,正好对上子游标的KGLHDADR=00000000E5D4F420。

SYS@192.168.X.X:1521/orcl> set desc linenum on
SYS@192.168.X.X:1521/orcl> @ desc v$open_cursor
           Name                            Null?    Type
           ------------------------------- -------- ----------------------------
    1      SADDR                                    RAW(8)
    2      SID                                      NUMBER
    3      USER_NAME                                VARCHAR2(128)
    4      ADDRESS                                  RAW(8)
    5      HASH_VALUE                               NUMBER
    6      SQL_ID                                   VARCHAR2(13)
    7      SQL_TEXT                                 VARCHAR2(60)
    8      LAST_SQL_ACTIVE_TIME                     DATE
    9      SQL_EXEC_ID                              NUMBER
   10      CURSOR_TYPE                              VARCHAR2(64)
   11      CHILD_ADDRESS                            RAW(8)
   12      CON_ID                                   NUMBER

--//可以发现12c比11g视图v$open_cursor增加2列.CHILD_ADDRESS,CON_ID.
--//也就是12c视图里面增加子光标handle address.

--//对比11g的情况:
SCOTT@book> @ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> set desc linenum on
SCOTT@book> @ desc v$open_cursor
           Name                            Null?    Type
           ------------------------------- -------- ----------------------------
    1      SADDR                                    RAW(8)
    2      SID                                      NUMBER
    3      USER_NAME                                VARCHAR2(30)
    4      ADDRESS                                  RAW(8)
    5      HASH_VALUE                               NUMBER
    6      SQL_ID                                   VARCHAR2(13)
    7      SQL_TEXT                                 VARCHAR2(60)
    8      LAST_SQL_ACTIVE_TIME                     DATE
    9      SQL_EXEC_ID                              NUMBER
   10      CURSOR_TYPE                              VARCHAR2(64)

3.继续测试:
--//session 1:
TTT@192.168.X.X:1521/orcl> alter session set optimizer_index_caching=1;
Session altered.

select * from dept where deptno=10;
--//执行多次.

--//session 2:
SYS@192.168.X.X:1521/orcl> select * from v$open_cursor where sid=395 and sql_id='4xamnunv51w9j'
  2  @ prxx
==============================
SADDR                         : 00000000924558D0
SID                           : 395
USER_NAME                     : TTT
ADDRESS                       : 00000001064A04D8
HASH_VALUE                    : 911274289
SQL_ID                        : 4xamnunv51w9j
SQL_TEXT                      : select * from dept where deptno=10
LAST_SQL_ACTIVE_TIME          : 2020-12-07 08:47:28
SQL_EXEC_ID                   :
CURSOR_TYPE                   : SESSION CURSOR CACHED
CHILD_ADDRESS                 : 00000000E5D4F420
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CON_ID                        : 3
==============================
SADDR                         : 00000000924558D0
SID                           : 395
USER_NAME                     : TTT
ADDRESS                       : 00000001064A04D8
HASH_VALUE                    : 911274289
SQL_ID                        : 4xamnunv51w9j
SQL_TEXT                      : select * from dept where deptno=10
LAST_SQL_ACTIVE_TIME          : 2020-12-07 08:53:03
SQL_EXEC_ID                   :
CURSOR_TYPE                   : SESSION CURSOR CACHED
CHILD_ADDRESS                 : 00000001031D80B8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CON_ID                        : 3

PL/SQL procedure successfully completed.

SYS@192.168.X.X:1521/orcl> set linesize 300
SYS@192.168.X.X:1521/orcl> @ sharepool/shp4 4xamnunv51w9j 0
TEXT                  KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03                     KGLOBT09
--------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- -------------------------- ----------
child handle address  00000000E5D4F420 00000001064A04D8 select * from dept where deptno=10                1          0          0 0000000076F94EE0 00000000BFBB9948       4072      16200       5035     25307      25307  911274289 4xamnunv51w9j                       0
child handle address  00000001031D80B8 00000001064A04D8 select * from dept where deptno=10                1          0          0 00000001031D7EF8 00000000E5C9A580       4072      16200       5035     25307      25307  911274289 4xamnunv51w9j                       1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
parent handle address 00000001064A04D8 00000001064A04D8 select * from dept where deptno=10                1          0          0 0000000100C653E0 00                     8144          0          0      8144       8144  911274289 4xamnunv51w9j                   65535
--//子游标句柄地址能与前面的视图对上.正是通过这个子游标句柄地址,能很快定位语句的执行计划,减少latch 或者mutex的消耗.

SYS@192.168.X.X:1521/orcl> column VIEW_DEFINITION format a80
SYS@192.168.X.X:1521/orcl> select * from V$FIXED_VIEW_DEFINITION where view_name='GV$OPEN_CURSOR';
VIEW_NAME       VIEW_DEFINITION                                                                      CON_ID
--------------- -------------------------------------------------------------------------------- ----------
GV$OPEN_CURSOR  select inst_id,kgllkuse, kgllksnm, user_name, kglhdpar, kglnahsh,                         0
                     kgllksqlid, kglnaobj, kgllkest,
                   decode(kgllkexc, 0, to_number(NULL), kgllkexc), kgllkctp,
                 kgllkhdl, con_id                                                       from x$k
                gllk where kglhdnsp = 0 and kglhdpar != kgllkhdl
--//12c v$open_cutsor增加CON_ID 字段外,还增加CHILD_ADDRESS字段.这样更加清晰指示执行计划使用那个子光标.
--//上官方网站.以下是11.1的参考:

https://docs.oracle.com/cd/B28359_01/server.111/b28320/dynviews_2081.htm#REFRN30166
V$OPEN_CURSOR
V$OPEN_CURSOR lists cursors that each user session currently has opened and parsed.
Column                  Datatype        Description
-----------------------------------------------------------------------------------------------------------------------------------------------
SADDR                   RAW(4 | 8)      Session address
SID                     NUMBER          Session identifier
USER_NAME               VARCHAR2(30)    User that is logged in to the session
ADDRESS                 RAW(4 | 8)      Used with HASH_VALUE to uniquely identify the SQL statement being executed in the session
HASH_VALUE              NUMBER          Used with ADDRESS to uniquely identify the SQL statement being executed in the session
SQL_ID                  VARCHAR2(13)    SQL identifier of the SQL statement being executed in the session
SQL_TEXT                VARCHAR2(60)    First 60 characters of the SQL statement that is parsed into the open cursor
LAST_SQL_ACTIVE_TIME    DATE            Time when this cursor was last executed
SQL_EXEC_ID             NUMBER          If the open cursor is executing, then the SQL execution identifier for that execution (see V$SQL_MONITOR)
--------------------------------------------------------------------------------------------------------------------------------------------------
--//11.2还增加了cursor_type字段.
--//这样就可以很好避免我以前遇到的困惑.链接:
--//http://blog.itpub.net/267265/viewspace-2682615/=>[20200326]dbms_monitor跟踪与SQL语句分析.txt

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

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969544