追踪 SQL 运行时间

kuevins 2006-02-15 03:25:14
我想自己写一个类似于 Trigger 的东西,记录 Oracle DB 中执行的 DML 语句以及它们的运行时间,有办法做到吗?
(注:不考虑用Oracle 自带的 SQL Trace 功能,因为我想把 trace 结果存入 table,以便统计分析)

或者有其他工具可以实现吗?
...全文
320 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rouqu 2006-02-17
  • 打赏
  • 举报
回复
select操作通过触发器的办法应该不能实现
Oracle中有没有类似MSSQL的Profiler?
kuevins 2006-02-16
  • 打赏
  • 举报
回复
to cenlmmx(学海无涯苦作舟) ,
感谢!v$sql 里面的资料是动态变的,而我需要把每一笔曾经运行过的 SQL 语句都记录下来,是否还可以有其他办法? 另外,它的 sql_text 栏位长度只有 1000,有些 SQL 不完整。

to rouqu(石林#黄果树) ,
如果用 trigger 的话,能记录到 SELECT 语句吗?怎么做?
tyro_oracle 2006-02-16
  • 打赏
  • 举报
回复
用SET TIMING ON 不就可以看语句的执行时间吗?
kuevins 2006-02-16
  • 打赏
  • 举报
回复
不仅仅是 INSERT/UPDATE/DELETE,也包含查询语句。
不仅仅是当前正在 running 的,也包含所有曾经执行过的。

看起来似乎可以设一个 JOB,每隔几分钟跑一次,抓出 v$sql 中的记录,存入另外一个 table。。。但这样子好像效率很差的说。。。
kuevins 2006-02-16
  • 打赏
  • 举报
回复
不好意思,误解误解。
但我不是想监控某个 table 啊。
说清楚一点,我就是想把
——曾经在 DB 中执行过的『所有』 SQL 语句——
都记录下来!
cenlmmx 2006-02-16
  • 打赏
  • 举报
回复
晕,你要监控的表名
kuevins 2006-02-16
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER T
BEFORE INSERT OR UPDATE OR DELETE ON MonitorTable

MonitorTable 是指什么??
cenlmmx 2006-02-16
  • 打赏
  • 举报
回复
和v$sql_text再关联,v$sql_text好象是全的(order by piece)
同时可以看看v$sqlarea
V$SQLAREA lists statistics on shared SQL area and contains one row per SQL string. It provides statistics on SQL statements that are in memory, parsed, and ready for execution.

用trigger的话
CREATE OR REPLACE TRIGGER T
BEFORE INSERT OR UPDATE OR DELETE ON MonitorTable
FOR EACH ROW
BEGIN
If updating Then
deal with yourlogtable;
End If;
IF inserting then
deal with yourlogtable;
End If;
IF deleting then
deal with yourlogtable;
End If;
END;
cenlmmx 2006-02-15
  • 打赏
  • 举报
回复
SQL> SELECT b.* from v$session a, v$sql b where a.sql_address =b.address;

SQL_TEXT SQL_FULLTEXT SQL_ID SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM SORTS LOADED_VERSIONS OPEN_VERSIONS USERS_OPENING FETCHES EXECUTIONS PX_SERVERS_EXECUTIONS END_OF_FETCH_COUNT USERS_EXECUTING LOADS FIRST_LOAD_TIME INVALIDATIONS PARSE_CALLS DISK_READS DIRECT_WRITES BUFFER_GETS APPLICATION_WAIT_TIME CONCURRENCY_WAIT_TIME CLUSTER_WAIT_TIME USER_IO_WAIT_TIME PLSQL_EXEC_TIME JAVA_EXEC_TIME ROWS_PROCESSED COMMAND_TYPE OPTIMIZER_MODE OPTIMIZER_COST OPTIMIZER_ENV OPTIMIZER_ENV_HASH_VALUE PARSING_USER_ID PARSING_SCHEMA_ID PARSING_SCHEMA_NAME KEPT_VERSIONS ADDRESS TYPE_CHK_HEAP HASH_VALUE OLD_HASH_VALUE PLAN_HASH_VALUE CHILD_NUMBER SERVICE SERVICE_HASH MODULE MODULE_HASH ACTION ACTION_HASH SERIALIZABLE_ABORTS OUTLINE_CATEGORY CPU_TIME ELAPSED_TIME OUTLINE_SID CHILD_ADDRESS SQLTYPE REMOTE OBJECT_STATUS LITERAL_HASH_VALUE LAST_LOAD_TIME IS_OBSOLETE CHILD_LATCH SQL_PROFILE PROGRAM_ID PROGRAM_LINE# EXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE LAST_ACTIVE_TIME BIND_DATA
-------------------------------------------------------------------------------- ------------ ------------- ------------ -------------- ----------- ---------- --------------- ------------- ------------- ---------- ---------- --------------------- ------------------ --------------- ---------- -------------------------------------- ------------- ----------- ---------- ------------- ----------- --------------------- --------------------- ----------------- ----------------- --------------- -------------- -------------- ------------ -------------- -------------- -------------------------------------------------------------------------------- ------------------------ --------------- ----------------- ------------------------------ ------------- -------- ------------- ---------- -------------- --------------- ------------ ---------------------------------------------------------------- ------------ ---------------------------------------------------------------- ----------- ---------------------------------------------------------------- ----------- ------------------- ---------------------------------------------------------------- ---------- ------------ ----------- ------------- ---------- ------ ------------------- ------------------ -------------------------------------- ----------- ----------- ---------------------------------------------------------------- ---------- ------------- ------------------------ ------------------------ ---------------- --------------------------------------------------------------------------------
SELECT b.* from v$session a, v$sql b where a.sql_address =b.address SELECT b.* f cpxng57j8n0jm 49642 28668 23960 0 1 1 1 0 1 0 0 1 2 2006-02-15/21:38:59 0 1 0 0 156 0 0 0 0 0 0 0 3 ALL_ROWS 1 E289FB89A1E49800BA0010006EF9C3E2CFEA33105641455551952110555555154554555859155544 2829153087 0 0 SYS 0 1C9E488C 00 3800695347 2896797038 2709903618 0 orcl 0 PL/SQL Developer 1190136663 命令窗口 - 新建 1316471608 0 30601 30601 1C9E47A8 6 N VALID 0 2006-02-15/21:39:43 N 1 2221 34 6.06947805093292E18 6.06947805093292E18 2006-2-15 21:39:
rouqu 2006-02-15
  • 打赏
  • 举报
回复
要看楼主的数据量多大 在不大的情况下用触发器做也可以考虑的
kuevins 2006-02-15
  • 打赏
  • 举报
回复
这个 view 能串到 v_$session 吗?
因为我还需要得到是在哪个 session 中下的 SQL。
cenlmmx 2006-02-15
  • 打赏
  • 举报
回复
v$sql.cpu_time.
如果用before insert or update or delete on table触发器来做,太消耗系统资源不可取.

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧