怎么查询一个用户执行过的SQL语句
本帖最后由 wh62592855 于 2009-11-20 20:55:50 编辑 今天论坛上一个朋友问怎么查询之前执行过的SQL语句,我当时没多想就给回了个
select sql_text from v$sql where parsing_schema_name='USERNAME' order by last_load_time desc;
可是我试了试发现这个语句是有些问题的,好像并不能查询该用户执行的所有SQL语句。比如说我在试验的过程中,SELECT和INSERT可以查出来,CREATE TABLE和DROP TABLE都不行。
而且有时候通过其他一些视图查出来的结果中包含了一些不该有的操作,看样子都是些对系统内部表的查询与操作,而并不是用户真正输入的语句。
V$SQL,V$SQL_TEXT,V$SQLAREA,V$OPEN_CURSOR,这几个视图里面字段又超级多,真的无从下手,有时都不知道该查哪个视图了,可能由于自己对这几个视图的定义和区别理解的还不够深吧,呵呵。这里也希望大家不吝赐教。
仔细想了想,关于这个查询用户执行SQL语句的话题应该可以分出不止一个分支的。比如说:
①查询某个用户在某段时间内执行过的所有SQL语句
②查询当前状态(意味着该SESSION并未断开 正处于活动状态)下某个用户执行过的所有SQL语句
③……
暂时好像就想到了这两个情况而已,哪位朋友想出新的情况了欢迎补充,大家一起讨论。
专门写这么个帖子,希望可以借此帖把这方面的事情彻底的搞清楚,当然,这离不开大家的帮助。
各位踊跃发言哈!
我嘛还才疏学浅,暂时连上面那两种情况的查询语句都还写不出来。
如果哪位以前对这方面做过专门的研究,或有有好的文章推荐,也可以贴出来大家一起学习学习!
当然,我这里说的是用查询来实现哦,LOGMINER和审计咱就不提了哦。
[最优解释]
v_sql_id);12 dbms_output.put_line('sqltext is:'
[其他解释]
哦……即时老化
呵呵 这个词用的很生动呀
SQL> select name from v$statname where statistic#=339;
NAME
--------------------
bytes received via S
QL*Net from dblink
OPER@tl> create or replace trigger tr_ddl
2 after create on schema
3 declare
4 v_sql_id varchar2(100);
5 v_sql varchar2(100);
6 begin
7 select sql_id,sql_text into v_sql_id,v_sql
8 from v$sqlarea
9 where sql_id=(select sql_id from v$session
10 where audsid=userenv('sessionid'));
11 dbms_output.put_line('sql_id is:'
[其他解释]
v_sql_id);
12 dbms_output.put_line('sqltext is:'
[其他解释]
v_sql);13end;14/
触发器已创建
OPER@tl>createtable test(aaanumber);
sql_idis:9gkx5dbw15x43
sqltextis:createtable test(aaanumber)
表已创建。
OPER@tl>select*from v$sqlareawhere sql_id='9gkx5dbw15x43';
未选定行
OPER@tl>select*from v$sqltextwhere sql_id='9gkx5dbw15x43';
ADDRESS HASH_VALUE SQL_ID COMMAND_TYPE PIECE SQL_TEXT-------- ---------- -------------- ------------ ---------- --------------------------2483CCFC4161991811 9gkx5dbw15x4310createtable test(aaanumber)
OPER@tl>
学习了
[其他解释]
----------------------------------------- -------- ----------------------------
SQL_TEXT VARCHAR2(1000)
SHARABLE_MEM NUMBER
PERSISTENT_MEM NUMBER
RUNTIME_MEM NUMBER
SORTS NUMBER
VERSION_COUNT NUMBER
LOADED_VERSIONS NUMBER
OPEN_VERSIONS NUMBER
USERS_OPENING NUMBER
FETCHES NUMBER
EXECUTIONS NUMBER
USERS_EXECUTING NUMBER
LOADS NUMBER
FIRST_LOAD_TIME VARCHAR2(38)
INVALIDATIONS NUMBER
PARSE_CALLS NUMBER
DISK_READS NUMBER
BUFFER_GETS NUMBER
ROWS_PROCESSED NUMBER
COMMAND_TYPE NUMBER
OPTIMIZER_MODE VARCHAR2(25)
PARSING_USER_ID NUMBER
PARSING_SCHEMA_ID NUMBER
KEPT_VERSIONS NUMBER
ADDRESS RAW(4)
HASH_VALUE NUMBER
MODULE VARCHAR2(64)
MODULE_HASH NUMBER
ACTION VARCHAR2(64)
ACTION_HASH NUMBER
SERIALIZABLE_ABORTS NUMBER
CPU_TIME NUMBER
ELAPSED_TIME NUMBER
IS_OBSOLETE VARCHAR2(1)
CHILD_LATCH NUMBER
v$sql ---------- 存储的是具体的SQL 和执行计划相关信息,实际上,v$sqlarea 可以看做 v$sql 根据 sqltext 等 做了 group by 之后的信息
SQL> desc v$sql
Name Null? Type
----------------------------------------- -------- ----------------------------
SQL_TEXT VARCHAR2(1000)
SHARABLE_MEM NUMBER
PERSISTENT_MEM NUMBER
RUNTIME_MEM NUMBER
SORTS NUMBER
LOADED_VERSIONS NUMBER
OPEN_VERSIONS NUMBER
USERS_OPENING NUMBER
FETCHES NUMBER
EXECUTIONS NUMBER
USERS_EXECUTING NUMBER
LOADS NUMBER
FIRST_LOAD_TIME VARCHAR2(38)
INVALIDATIONS NUMBER
PARSE_CALLS NUMBER
DISK_READS NUMBER
BUFFER_GETS NUMBER
ROWS_PROCESSED NUMBER
COMMAND_TYPE NUMBER
OPTIMIZER_MODE VARCHAR2(10)
OPTIMIZER_COST NUMBER
PARSING_USER_ID NUMBER
PARSING_SCHEMA_ID NUMBER
KEPT_VERSIONS NUMBER
ADDRESS RAW(4)
TYPE_CHK_HEAP RAW(4)
HASH_VALUE NUMBER
PLAN_HASH_VALUE NUMBER
CHILD_NUMBER NUMBER ---------- 注意这个
MODULE VARCHAR2(64)
MODULE_HASH NUMBER
ACTION VARCHAR2(64)
ACTION_HASH NUMBER
SERIALIZABLE_ABORTS NUMBER
OUTLINE_CATEGORY VARCHAR2(64)
CPU_TIME NUMBER
ELAPSED_TIME NUMBER
OUTLINE_SID NUMBER -------------- 注意这里跟 outline 有关
CHILD_ADDRESS RAW(4)
SQLTYPE NUMBER
REMOTE VARCHAR2(1)
OBJECT_STATUS VARCHAR2(19)
LITERAL_HASH_VALUE NUMBER
LAST_LOAD_TIME VARCHAR2(38)
IS_OBSOLETE VARCHAR2(1)
CHILD_LATCH NUMBER
另外注意这个
QL> desc v$sql_plan
Name Null? Type
----------------------------------------- -------- ----------------------------
ADDRESS RAW(4)
HASH_VALUE NUMBER
CHILD_NUMBER NUMBER ------------ 注意这个和 v$sql 里面的相同字段
OPERATION VARCHAR2(60)
OPTIONS VARCHAR2(60)
OBJECT_NODE VARCHAR2(20)
OBJECT# NUMBER
OBJECT_OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(64)
OPTIMIZER VARCHAR2(40)
ID NUMBER
PARENT_ID NUMBER
DEPTH NUMBER
POSITION NUMBER
SEARCH_COLUMNS NUMBER
COST NUMBER
CARDINALITY NUMBER
BYTES NUMBER
OTHER_TAG VARCHAR2(70)
PARTITION_START VARCHAR2(10)
PARTITION_STOP VARCHAR2(10)
PARTITION_ID NUMBER
OTHER VARCHAR2(4000)
DISTRIBUTION VARCHAR2(40)
CPU_COST NUMBER
IO_COST NUMBER
TEMP_SPACE NUMBER
ACCESS_PREDICATES VARCHAR2(4000)
FILTER_PREDICATES VARCHAR2(4000)
实际上,看起来同样的一句SQL ,往往具有不同的执行计划
如果是不同的数据库用户,那么相应的涉及的 对象 可能都不一样,注意v$sql 中
OBJECT# NUMBER
OBJECT_OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(64)
OPTIMIZER VARCHAR2(40)
即使是相同的数据库用户,若 session 的优化模式、session 级的参数 等不一样,执行计划也能不同。所以即使相同的sql,也可能具有不同的执行计划!
v$sql join to v$sql_plan 就代表了具体的sql的执行计划,通过下面3个字段做连接
ADDRESS RAW(4)
HASH_VALUE NUMBER
CHILD_NUMBER NUMBER
而v$SQLAREA 忽略了 执行计划 等差异,只是在形式上sql文本看起来一样!相当于做了个聚合,是多个不同执行计划的sql的聚合和累计信息
[其他解释]
自己来个沙发~
[其他解释]
呵呵 谢谢哈
SELECT好像也可以?
--SYS窗口
SQL> select sql_text from v$sql where parsing_schema_name='SCOTT'
2 order by last_load_time desc;
no rows selected
SQL> /
SQL_TEXT
-------------------------------------------
select * from dept
SQL>
--SCOTT窗口
SQL> show user
USER is "SCOTT"
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON