探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句_oracle

Oracle数据库查看一个进程是如何执行相关的实际SQL语句

复制代码 代码如下:

SELECT b.sql_text, sid, serial#, osuser, machine 
    FROM v$session a, v$sqlarea b 
    WHERE a.sql_address = b.address; 

查询前台发出的SQL语句.

复制代码 代码如下:

select user_name,sql_text 
from v$open_cursor 
where sid in
(select sid from (select sid,serial#,username,program from v$session where status='ACTIVE'));

根据SPID查询session

复制代码 代码如下:

SELECT * FROM v$session WHERE paddr IN
(SELECT addr FROM v$process WHERE spid=&spid);

根据SID查询process

复制代码 代码如下:

SELECT * FROM v$process WHERE addr IN
(SELECT paddr FROM v$session WHERE sid=&sid);

DBA如何查询其他用户所进行的操作

复制代码 代码如下:

SELECT sql_text 
FROM v$sql t1, v$session t2 
WHERE t1.address = t2.sql_address 
AND t2.sid = &sid;

根据process查询sql语句

复制代码 代码如下:

SELECT  sql_text
    FROM v$sqltext a
   WHERE (a.hash_value, a.address) IN (
            SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value ),
                           DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
              FROM v$session b
              WHERE b.paddr = (SELECT addr
                                FROM v$process c
                                WHERE c.spid = '$processID'))
ORDER BY piece ASC;

其他
执行下列命令语句

复制代码 代码如下:

sqlplus / as sysdba <<EOF
create tablespace test  datafile '/data/test01.dbf' size 10240M;
quit;
EOF

通过ps -ef|grep sqlplus命令得到上面所执行的命令的进程id为:12345
(1)关于v$process
执行下面的SQL是查不到相关的信息:
select * from v$process where spid='12345';
因为这个spid字段对应的并不是我们用ps命令从系统中查询到的进程id,而是这个进程执行的当前SQL的进程id,
也就是上面命令中的“create tablespace test  datafile '/data/test01.dbf' size 10240M;”所对应的进程id,如果想
通过用ps命令从系统中查询到的进程id查看对应的信息,那么必须使用下面语句:
select spid,sid,process,sql_address from v$session where process='12345'
上面sql中的process就是通过ps查看的进程id,而spid就是里面的sql语句所对应的进程id。
还可以通过上面的sql_address 查看正在执行的SQL语句内容:
select sql_text from v$sqlarea s,v$session ses where s.address=ses.sql_address and ses.process='12345';
(2)关于v$session
在查询 v$session 视图的时候,我们根据command字段内部表示解码每一个字段,当我们需要快速找出他们的 Oracle 系统的内部情况时非常有用。

复制代码 代码如下:

select
substr(s.username,1,18) username,substr(s.program,1,15) program,p.spid,s.process,
decode(s.command,
0,'No Command',
1,'Create Table',
2,'Insert',
3,'Select',
6,'Update',
7,'Delete',
9,'Create Index',
15,'Alter Table',
21,'Create View',
23,'Validate Index',
35,'Alter Database',
39,'Create Tablespace',
41,'Drop Tablespace',
40,'Alter Tablespace',
53,'Drop User',
62,'Analyze Table',
63,'Analyze Index',
s.command||': Other') command
from
v$session s,
v$process p,
v$transaction t,
v$rollstat r,
v$rollname n
where s.paddr = p.addr
and s.taddr = t.addr (+)
and t.xidusn = r.usn (+)
and r.usn = n.usn (+)
order by username

(3)几个相关的SQL
--查看系统进程对应的信息

复制代码 代码如下:

select se.saddr,se.sid,se.serial#,p.pid,se.paddr,s.sql_id,s.sql_text
from v$session se ,v$process p, v$sqlarea s
where se.paddr=p.addr and se.sql_address=s.address and se.process='&1'
and se.username is not null

--查看所有的会话

复制代码 代码如下:

select se.username,se.saddr,se.sid,se.serial#,se.process,s.sql_id
from v$session se,v$sqlarea s
where se.sql_address=s.address

--查看会话对应的sql内容

复制代码 代码如下:

select se.username,se.process,s.sql_text
from v$session se,v$sqlarea s
where se.sql_address=s.address and s.sql_id='&1'

时间: 2025-01-02 17:07:58

探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句_oracle的相关文章

基于ORACLE数据库的循环建表及循环创建存储过程的SQL语句实现

一.概述 在实际的软件开发项目中,我们经常会遇到需要创建多个相同类型的数据库表或存储过程的时候.例如,如果按照身份证号码的尾号来分表,那么就需要创建10个用户信息表,尾号相同的用户信息放在同一个表中. 对于类型相同的多个表,我们可以逐个建立,也可以采用循环的方法来建立.与之相对应的,可以用一个存储过程实现对所有表的操作,也可以循环建立存储过程,每个存储过程实现对某个特定表的操作. 本文中,我们建立10个员工信息表,每个表中包含员工工号(8位)和年龄字段,以工号的最后一位来分表.同时,我们建立存储

oracle下巧用bulk collect实现cursor批量fetch的sql语句_oracle

在一般的情况下,使用批量fetch的几率并不是很多,但是Oracle提供了这个功能我们最好能熟悉一下,说不定什么时候会用上它.  复制代码 代码如下: declare  cursor c1 is select * from t_depart;  v_depart t_depart%rowtype ;  type v_code_type is table of t_depart.depart_code%type ;  v_code v_code_type ;  type v_name_type i

oracle 数据库用的plsql工具,执行的sql按F5查看cpu耗费,请教高手帮忙解答!

问题描述 oracle 数据库用的plsql工具,执行的sql按F5查看cpu耗费,请教高手帮忙解答! 主要区别在于走索引,走了索引,耗费降低,但是执行速度变慢了,但是不走索引,执行速度变快了,但是耗费上升!请问原因是什么?是不是意味着,耗费越高,执行速度越快吗?还是两者没有必然联系?我们在设计sql时,是要先考虑哪方面? 解决方案 楼主 你知不知道索引的意思? 索引类似书的目录结构,按照索引查找执行速度怎么变慢了呢? 至于耗费和速度的关系就如同你跑步一样的 你费力气点跑,就跑的快一点 你省力气

在Linux下如何查看一个进程的运行时间

我是一个 Linux 系统的新手.我该如何在我的 Ubuntu 服务器上查看一个进程(或者根据进程 id 查看)已经运行了多久? 你需要使用 ps 命令来查看关于一组正在运行的进程的信息.ps 命令提供了如下的两种格式化选项. etime 显示了自从该进程启动以来,经历过的时间,格式为 [[DD-]hh:]mm:ss. etimes 显示了自该进程启动以来,经历过的时间,以秒的形式. 如何查看一个进程已经运行的时间? 你需要在 ps 命令之后添加 -o etimes 或者 -o etime 参数

在 Linux 下如何查看一个进程的运行时间

我是一个 Linux 系统的新手.我该如何在我的 Ubuntu 服务器上查看一个进程(或者根据进程 id 查看)已经运行了多久? 你需要使用 ps 命令来查看关于一组正在运行的进程的信息.ps 命令提供了如下的两种格式化选项. etime 显示了自从该进程启动以来,经历过的时间,格式为 [[DD-]hh:]mm:ss. etimes 显示了自该进程启动以来,经历过的时间,以秒的形式. 如何查看一个进程已经运行的时间? 你需要在 ps 命令之后添加 -o etimes 或者 -o etime 参数

为什么数据库有时候不能定位阻塞(Blocker)源头的SQL语句

    在SQL Server数据库或OACLE数据库当中,通常一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking).这是DBA经常会遇到的情况.当出现SQL语句的阻塞时,很多人想查看阻塞的源头(哪个SQL语句阻塞了哪个SQL),这样方便直观.简洁明了的定位问题.但是很多时候,很多场景,我们通过SQL语句并不能或者说不容易定位到阻塞者(Blocker)的SQL语句,当然我们可以很容易找到被阻塞的SQL语句,以及它在等待的锁资源.下面我们先分析一下SQL Serv

一列一列向access表中插入数据,列数是一个变量,用循环,用什么sql语句

问题描述 一列一列向access表中插入数据,列数是一个变量,用循环,用什么sql语句 用sql语句向ACCESS的一张表中添加数据,因为具体的列数还不清楚,所以想用循环一列一列向ACCESS表中插入数据,采用insert,为什么插入30行数据(即一列),当插第二列数据时就从第31行,第二列开始了(应该是第一行第二列开始).如果不用insert,用update那语句怎么写,一直出错. 解决方案 你的数据库表结构有问题.你应该把你的列作为行来插入.数据库中的表,列就应该是确定的. 解决方案二: 你

如何对oracle jdbc执行的每条sql语句进行检测?

问题描述 请问大家如何对jdbc执行的每条sql语句进行检测?例如:PrepareStatementpstmt=conn.prepareStatement(LOAD_ALLSURVEY);rs=pstmt.executeQuery();如何在执行rs=pstmt.executeQuery();时将执行的sql语句和参数打印出来?我试过的方法有:1.找到classes12.jar的源代码,并对其进行修改,然后再打包,但是没有找到对应的源代码?2.对其进行反编译,但是效果不怎么理想.请问大家有什么好

探讨ORACLE数据库的数据导入方法

oracle|数据|数据库 前言每个数据库管理员都会面临数据导入的问题,这有可能发生在数据库的新老移植过程中,或者是在数据库崩溃后的恢复重建过程中,还有可能是在创建测试数据库的模拟环境过程中,总之作为一名合格的数据库管理员,你应该做好接受各种数据导入请求的技术储备,同时还要尽量满足人本能的对导入速度的苛求.本文仅针对 Oracle 数据库所提供的加速数据导入的各种特性和技术进行探讨,其中的一些方法也可以转化应用于其他数据库.以下七种数据导入方法哪个最适用需要针对具体情况具体分析,我也附带列举了影