草庐IT

[20230220]探究v$session.SQL_EXEC_ID在共享池.txt

lfree 2023-03-28 原文
[20230220]探究v$session.SQL_EXEC_ID在共享池.txt

--//http://blog.tanelpoder.com/2011/10/24/what-the-heck-is-the-sql-execution-id-sql_exec_id/

1.环境:
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

2.测试:
--//session 1:
SCOTT@book> SELECT sql_exec_id,sysdate  FROM v$session WHERE sid = USERENV('SID');
SQL_EXEC_ID SYSDATE
----------- -------------------
   16777216 2023-02-20 11:10:31

SCOTT@book> @ hash
HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
1619099043 9jwq10th82zd3            0      97699      2422122865  60817da3  2023-02-20 11:10:31    16777216

SCOTT@book> SELECT sql_exec_id,sysdate  FROM v$session WHERE sid = USERENV('SID');
SQL_EXEC_ID SYSDATE
----------- -------------------
   16777217 2023-02-20 11:10:56

--//退出会话再次执行:
--//session 1:
SCOTT@book> SELECT sql_exec_id,sysdate  FROM v$session WHERE sid = USERENV('SID');
SQL_EXEC_ID SYSDATE
----------- -------------------
   16777218 2023-02-20 11:11:14

--//16777216 = 0x1000000,共6个0占24位,从0开始记录执行次数.前面8位表示那个实例执行该语句.最大256个实例.
--//按照链接的介绍,就是表示实例执行该语句的次数,占32位,前面占8位表示实例(最多256个),后面占24位表示执行次数从0开始记录,
--//一旦操作超过2^24 = 16777216就溢出了.
--//最大执行计数是 0xffffff = 16777215, 也就是记录的执行次数最大2^24 = 16777216.

3.我的好奇是这个计数的东西保存在那里,如果每条sql语句都有记录,可以推测应该单独保存在父游标里面吗?验证看看.

--//session 2,清除共享池,注意session 1当前的光标没有关闭:
SYS@book> @ flush_sql.sql 9jwq10th82zd3 1
PL/SQL procedure successfully completed.

--//session 1:
SCOTT@book> SELECT sql_exec_id,sysdate  FROM v$session WHERE sid = USERENV('SID');
SQL_EXEC_ID SYSDATE
----------- -------------------
   16777219 2023-02-20 11:12:18
--//SQL_EXEC_ID=16777219,计数还是在增加!!注上面执行的会话没有退出,光标还是打开的.保存在父光标某个位置的可能性最大.
--//session 1:
SCOTT@book> select sysdate from dual ;
SYSDATE
-------------------
2023-02-20 11:13:02

--//session 2,再次清除共享池,注意session 1当前的光标已经关闭:
SYS@book> alter system flush shared_pool;
System altered.

SYS@book> @ sharepool/shp4 9jwq10th82zd3
no rows selected

--//session 1:
SCOTT@book> SELECT sql_exec_id,sysdate  FROM v$session WHERE sid = USERENV('SID');
SQL_EXEC_ID SYSDATE
----------- -------------------
   16777216 2023-02-20 11:14:32

--//可以发现一旦刷新共享池父光标不再了,再次执行计数重新开始,为什么前面执行flush_sql.sql而计数还是在增加呢?因为前面测试
--//光标出于打开状态.
--//session 1,执行多次略.

SCOTT@book> SELECT sql_exec_id,sysdate  FROM v$session WHERE sid = USERENV('SID');
SQL_EXEC_ID SYSDATE
----------- -------------------
   16777224 2023-02-20 11:16:01
--//16777224= 0x1000008

4.继续测试:
--//session 2:
SYS@book> @ sharepool/shp4x 9jwq10th82zd3
TEXT                  KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
--------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
child handle address  000000007C23A960 000000007C2F4F60 SELECT sql_exec_id,sysdate  FROM v$sessi          1          0          0 000000007D6F97C8 000000007CEF6308       4544      24312       3102     31958      31958 1619099043 9jwq10th82zd3          0
parent handle address 000000007C2F4F60 000000007C2F4F60 SELECT sql_exec_id,sysdate  FROM v$sessi          1          0          0 000000007D657258 00                     4752          0          0      4752       4752 1619099043 9jwq10th82zd3      65535

SYS@book> @ fcha 000000007C2F4F60
Find in which heap (UGA, PGA or Shared Pool) the memory address 000000007C2F4F60 resides...
Press ENTER to continue, CTRL+C to cancel...

LOC KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
--- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ----------------
SGA 000000007C2F4F30          2          1 KGLHD                   592 recr             80 00
--//开始位置0x000000007C2F4F30.

SYS@book> oradebug setmypid
Statement processed.
SYS@book> oradebug peek 0x000000007C2F4F30 592 1
[07C2F4F30, 07C2F5180) = 00000251 80B38F00 7C2F4D10 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00080050 813F3870 00000000 ...

--//session 1:
SCOTT@book> SELECT sql_exec_id,sysdate  FROM v$session WHERE sid = USERENV('SID');
SQL_EXEC_ID SYSDATE
----------- -------------------
   16777225 2023-02-20 11:19:32
--//16777225= 0x1000009

--//session 2:
SYS@book> @ ti
New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_17141_0001.trc

SYS@book> oradebug peek 0x000000007C2F4F30 592 1
[07C2F4F30, 07C2F5180) = 00000251 80B38F00 7C2F4D10 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00080050 813F3870 00000000 ...

$ diff book_ora_17141_0001.trc book_ora_17141.trc
...
< *** 2023-02-20 11:19:40.645
---
> *** 2023-02-20 11:18:45.674
36c37
< 07C2F4F90 00010001 00000002 00000000 0000000A  [................]
                                       ~~~~~~~~~
---
> 07C2F4F90 00010001 00000002 00000000 00000009  [................]
                                       ~~~~~~~~
67c68
...

--//注意看下划线09->0a,估计在这个位置,验证看看,不要在生产系统做如下这个测试.
--//0xF9C-0xF30 = 108 = 0x6c.

SYS@book> oradebug peek 0x07C2F4F9C 4
[07C2F4F9C, 07C2F4FA0) = 0000000A

SYS@book> oradebug poke 0x07C2F4F9C 4 0x000000AA
BEFORE: [07C2F4F9C, 07C2F4FA0) = 0000000A
AFTER:  [07C2F4F9C, 07C2F4FA0) = 000000AA

--//session 1:
SCOTT@book> SELECT sql_exec_id,sysdate  FROM v$session WHERE sid = USERENV('SID');
SQL_EXEC_ID SYSDATE
----------- -------------------
   16777386 2023-02-20 11:25:04

--//16777386= 0x10000aa,验证自己的判断,看看现在该位置记录怎么内容.

SYS@book> oradebug peek 0x07C2F4F9C 4
[07C2F4F9C, 07C2F4FA0) = 000000AB
--//现在记录的是0x000000AB,基本可以验证SQL_EXEC_ID值保存在父游标中.
--//book_ora_17141.trc
Dump of memory from 0x07C2F4F44 to 0x07C2F5180
07C2F4F40          00000000 00000000 00000000      [............]
07C2F4F50 00000000 00000000 00000000 00080050  [............P...]
07C2F4F60 813F3870 00000000 813F3870 00000000  [p8?.....p8?.....]
07C2F4F70 7CEF5C48 00000000 7C2F50B8 00000000  [H\.|.....P/|....]
07C2F4F80 00010000 10012841 00000001 00000001  [....A(..........]
07C2F4F90 00010001 00000002 00000000 0000000A  [................]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

5.在光标打开的情况下刷新共享池看看:
SYS@book> alter system flush shared_pool;
System altered.

SYS@book> @ sharepool/shp4x 9jwq10th82zd3
TEXT                  KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
--------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
child handle address  000000007C23A960 000000007C2F4F60 SELECT sql_exec_id,sysdate  FROM v$sessi          1          0          1 00               00                        0          0       3102      3102       3102 1619099043 9jwq10th82zd3          0
parent handle address 000000007C2F4F60 000000007C2F4F60 SELECT sql_exec_id,sysdate  FROM v$sessi          1          0          1 000000007D657258 00                     4752          0          0      4752       4752 1619099043 9jwq10th82zd3      65535
--//你可以发现子光标的KGLOBHD0,KGLOBHD6已经清除,而父光标还在!!
--//session 1:
SCOTT@book> select sysdate from dual ;
SYSDATE
-------------------
2023-02-20 11:28:53

--//session 2:
SYS@book> alter system flush shared_pool;
System altered.

SYS@book> @ sharepool/shp4x 9jwq10th82zd3
no rows selected

--//session 1:
SCOTT@book> SELECT sql_exec_id,sysdate  FROM v$session WHERE sid = USERENV('SID');
SQL_EXEC_ID SYSDATE
----------- -------------------
   16777216 2023-02-20 11:29:18
--//回到初始值.

6.总结:
--//可以得出结论:sql_exec_id保存在父游标中.
--//刷新共享池可能导致sql_exec_id重新计数,在这样的情况下使用它判断执行次数可能存在错误.

有关[20230220]探究v$session.SQL_EXEC_ID在共享池.txt的更多相关文章

  1. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  2. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  3. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  4. ruby-on-rails - Rails 优雅地处理超时 session ? - 2

    使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p

  5. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  6. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

  7. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

  8. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

  9. ruby - Sinatra session 未按预期持续 - 2

    我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL

  10. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

随机推荐