oracle prev_sql_id,为什么V$SESSSION下的SQL_ID有时候为NULL_weixin_42601702的博客-程序员宅基地

技术标签: 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.

分享到:

更多

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42601702/article/details/116541370

智能推荐

Leetcode动态规划笔记4 整数拆分_leetcode剪绳子剪多少段然后乘积更大 动态规划-程序员宅基地

整数拆分、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剪绳子剪多少段然后乘积更大 动态规划

java中对长字符串的各种截取_substring截取超长_卓尔不群是为妖的博客-程序员宅基地

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截取超长

Python 类和对象练习题_拓拔刘的博客-程序员宅基地

1.定义一个桌子类(Desk),包含长(length)、宽(width)、高(height)属性,包含一个打印桌子信息属性的方法(showInfo)。实例化2个桌子对象,为其赋予不同的属性值,并调用showInfo方法,输出每个桌子的信息。class Desk: def __init__(self, length, width, height): self.length = length self.width = width self.heig

Beyond Sharing Weights for Deep Domain Adaptation_Vic_Hao的博客-程序员宅基地

本文中心:specializing the network weights outperforms sharing them依据(假设):domain invariance might very well be detrimental to discriminative power验证假设的方式:introducing an approach that explicitly models...

latex 段间距离太大_我是家家的博客-程序员宅基地

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..._已知虚拟地址求物理地址

随便推点

iOS-UI-滚动视图2—分页查看功能_Jeyzq的博客-程序员宅基地

//// ViewController.m// UI-滚动视图2—分页查看//// Created by jzq_mac on 15/7/29.// Copyright (c) 2015年 jzq_mac. All rights reserved.//#import "ViewController.h"

debuge和release的区别_DOOM的博客-程序员宅基地

看下面这段代码: char* c1 = "abc"; int i; i=1; int a[4]; { int j; j=2; }_debuge

基于以太坊的DAPP实现_八月对半的博客-程序员宅基地

基于以太坊的DAPP实现系统采用vm下ubuntu16.04一、 以太坊介绍       以太坊是一个开源的有智能合约功能的公共区块链平台。通过其专用加密货币以太币(Ether)提供去中心化的虚拟机(“以太虚拟机” Ethereum Virtual Machine)来处理点对点合约。  &nbs...

QT 调试问题_qt 结构体指针 variable is uninitiated when used-程序员宅基地

莫名奇妙的LINK2019写了新类,在创建对象的时候出现LINK2019,处理办法是删除了build文件夹启发就是,语法上觉得没有问题。先清除,然后删除bulid文件。_qt 结构体指针 variable is uninitiated when used

【【运维】9个网络故障排除经典案例,你都得会吗?】_运维遇到的故障案例_GLAB-Mary的博客-程序员宅基地

​一、故障排除思路定位故障范围①全网性网络故障:可定位故障源在出口或核心区域;②小范围网络故障:可定位故障源在离故障源最近的相应设备或链路;③单点性网络故障:可定位故障源在故障源自身。排除故障①总体上思路为“链路”à“配置”。②首先确认网络或相关设备是否出现人为变更;③其次检查物理链路、设备是否正常;④最后检查网络设备的相关属性或配置。二、常用排错方法1、网络设备①查看状态灯,包括 电源指示灯、状态灯、报警灯;②感知设备的温度,检查设备是否温度过高。2、物理链路①检查链路指示灯_运维遇到的故障案例

SNMP用VC++6.0实现的方法_VC技术_C语言教程(本文来自21视频教程网C语言频道)_iteye_3619的博客-程序员宅基地

SNMP(Simple Network Management Protocol)是简单网络管理协议,主要用来管理网络设备,正因为“简单”,所以其发展很快,到目前为止几乎所有的网络产品都要为其提供支持,以方便管理员的管理和软件开发人员的开发。 在这里我们不对有关SNMP的概念和基础知之作过多地阐述,一且假定你对其工作原理有了一定的了解,而仅缺的是如何去实现他。 我们所阐述的是基于VC6.0下..._vc++ snmp组件

推荐文章

热门文章

相关标签