技术标签: oracle prev_sql_id
SQL_ID和PREV_SQL_ID在我们日常监控会话的SQL语句中非常重要,有时候我们经常看到SQL_ID是空的情况,那么我们就会去找 PREV_SQL_ID的值来获取最后一次执行的SQL语句.那么有一个疑问?什么时候SQL_ID有值,什么时候它又是空的呢?下面我们会来做一个小实验,我的实验环境是Oracle 11gR2.通过实验来说明这个问题.
1.首先我们来模拟单会话查询;
>>>>>>>>session1>>>>>>>>
SQL> select sid from v$mystat where rownum=1;
SID
----------
403
select * from v$datafile where rownum=1;
select * from dba_tables where rownum=1;
select * from t1 where rownum=1; -------普通表
select * from aaa; -------普通视图
select * from dba_tables; ------------长查询
>>>>>>>>session2>>>>>>>>>
SQL> select sid,sql_id,PREV_SQL_ID from v$session where sid=403;
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 80hfhzra2uv3z
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 18s1d1fq9nzp2 18s1d1fq9nzp2
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 b61hdn491z56k
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 4njm39vk9m633
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 7tz9tdx2npk9t 4njm39vk9m633
在这里我们可以很清晰的看到,在我们运行长时间的sql查询时,我们正在运行的SQL_ID会是当前正在运行的sql语句.不过有个例外,在执行dba_tables这样的视图时,执行完之后,我们的 SQL_ID和PREV_SQL_ID都是有值的,而且保持一致.
2.接下来是DML测试.
>>>>>>>>session1>>>>>>>>
update test set id=5 where id=3;
commit;
update t4 set OWNER='ttt'; ---------t4 75273行
commit
>>>>>>>>session2>>>>>>>>>
SQL> select sid,sql_id,PREV_SQL_ID from v$session where sid=403;
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 38yz7yvht2268
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 38yz7yvht2268
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 60hhc0y04465g 60hhc0y04465g
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 60hhc0y04465g
只要一运行就会有PREV_SQL_ID,不管是提交还是回滚.如果是大批量并且不提交的情况下,SQL_ID和PREV_SQL_ID保持一致,提交或者回滚之后SQL_ID变为空.
下面是模拟锁定的情况.
>>>>>>>>session1>>>>>>>>
SQL> update test set id=5 where id=3;
1 row updated.
>>>>>>>>session2>>>>>>>>
SQL> select sid from v$mystat where rownum=1;
SID
----------
407
SQL> update test set id=5 where id=3;
>>>>>>>>session3>>>>>>>>
SQL> select sid,sql_id,PREV_SQL_ID from v$session where sid in (403,407);
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 38yz7yvht2268
407 38yz7yvht2268 dyk4dprp70d74
在DML语句出现锁定情况时,我们的阻塞者只会有PREV_SQL_ID,而被阻塞者会有SQL_ID.提交或者回滚之后,两者都只会有PREV_SQL_ID.
>>>>>>>>session1>>>>>>>>
SQL> commit;
Commit complete.
>>>>>>>>session3>>>>>>>>
SQL> select sid,sql_id,PREV_SQL_ID from v$session where sid in (403,407);
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 38yz7yvht2268
407 38yz7yvht2268
3.DDL语句的测试
>>>>>>>>session1>>>>>>>>
SQL> create table t3
2 ( id number);
Table created.
SQL> alter table t3 add name varchar2(20);
Table altered.
SQL> truncate table t3;
Table truncated.
SQL> drop table t3;
Table dropped.
>>>>>>>>session3>>>>>>>>
SQL> select sid,sql_id,PREV_SQL_ID from v$session where sid =403;
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 0xmrqqc98s98c 0xmrqqc98s98c
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 g1d3zhz7wq0d4 g1d3zhz7wq0d4
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 b3pbmwjuzmw24 b3pbmwjuzmw24
SQL> /
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
403 7ajbnzrag3jrw
可以看到在运行create,alter,truncate的时候,SQL_ID和PREV_SQL_ID都是保持一致的,然而在运行drop语句的时候,SQL_ID是空的.
其实还有很多种情况,大家可以自己去模拟.我这里只是做个总结:
1.在基本普通查询中,查询完之后,SQL_ID和PREV_SQL_ID都有值,并且保持一致.
2.较长时间的查询,在查询过程中,SQL_ID存在,查完后SQL_ID将不复存在,取而代之的是PREV_SQL_ID.
3.短小DML语句,执行完后,只会有PREV_SQL_ID,不管你是提交还是回滚,都会存在.
4.长DML语句,执行完后,SQL_ID和PREV_SQL_ID都有值,并且保持一致.提交和回滚后,只有PREV_SQL_ID.
5.产生锁的时候, 阻塞者只会有PREV_SQL_ID,而被阻塞者会有SQL_ID和PREV_SQL_ID
6.DDL语句,create,alter,truncate,会有SQL_ID和PREV_SQL_ID,drop只会有PREV_SQL_ID.
分享到:
更多
整数拆分、I. 剪绳子:拆分整数使得到的数字乘积最大给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。(给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n 都是整数,n>1 并且 m>1),每段绳子的长度记为 k[0], k[1]... k[m-1]。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是18。_leetcode剪绳子剪多少段然后乘积更大 动态规划
1. 使用split("正则表达式")来分割字符串,返回字符串数组因为分析正则比较耗时,所以这种方式会有很大的性能损耗。例:String s = "asd,123,qw12,as22";String[] result = s.split(",");for(int i=0;i<result.length;i++){System.out.println("结果:"+resul..._substring截取超长
1.定义一个桌子类(Desk),包含长(length)、宽(width)、高(height)属性,包含一个打印桌子信息属性的方法(showInfo)。实例化2个桌子对象,为其赋予不同的属性值,并调用showInfo方法,输出每个桌子的信息。class Desk: def __init__(self, length, width, height): self.length = length self.width = width self.heig
本文中心:specializing the network weights outperforms sharing them依据(假设):domain invariance might very well be detrimental to discriminative power验证假设的方式:introducing an approach that explicitly models...
latex 段间距离太大\vspace{-2mm}可在段尾,或者段头加此命令进行调整。
十进制转换为二进制0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 10 1011 11 1100 12 11..._已知虚拟地址求物理地址
//// ViewController.m// UI-滚动视图2—分页查看//// Created by jzq_mac on 15/7/29.// Copyright (c) 2015年 jzq_mac. All rights reserved.//#import "ViewController.h"
看下面这段代码: char* c1 = "abc"; int i; i=1; int a[4]; { int j; j=2; }_debuge
基于以太坊的DAPP实现系统采用vm下ubuntu16.04一、 以太坊介绍 以太坊是一个开源的有智能合约功能的公共区块链平台。通过其专用加密货币以太币(Ether)提供去中心化的虚拟机(“以太虚拟机” Ethereum Virtual Machine)来处理点对点合约。 &nbs...
莫名奇妙的LINK2019写了新类,在创建对象的时候出现LINK2019,处理办法是删除了build文件夹启发就是,语法上觉得没有问题。先清除,然后删除bulid文件。_qt 结构体指针 variable is uninitiated when used
一、故障排除思路定位故障范围①全网性网络故障:可定位故障源在出口或核心区域;②小范围网络故障:可定位故障源在离故障源最近的相应设备或链路;③单点性网络故障:可定位故障源在故障源自身。排除故障①总体上思路为“链路”à“配置”。②首先确认网络或相关设备是否出现人为变更;③其次检查物理链路、设备是否正常;④最后检查网络设备的相关属性或配置。二、常用排错方法1、网络设备①查看状态灯,包括 电源指示灯、状态灯、报警灯;②感知设备的温度,检查设备是否温度过高。2、物理链路①检查链路指示灯_运维遇到的故障案例
SNMP(Simple Network Management Protocol)是简单网络管理协议,主要用来管理网络设备,正因为“简单”,所以其发展很快,到目前为止几乎所有的网络产品都要为其提供支持,以方便管理员的管理和软件开发人员的开发。 在这里我们不对有关SNMP的概念和基础知之作过多地阐述,一且假定你对其工作原理有了一定的了解,而仅缺的是如何去实现他。 我们所阐述的是基于VC6.0下..._vc++ snmp组件