Oracle:是否有一个跟踪查询的工具,比如Profiler for sql server?

时间:2008-09-29 13:31:19

标签: sql-server oracle profiler

我使用sql server,但我必须使用Oracle DB迁移到应用程序。 为了跟踪我的应用程序查询,在Sql Server中我使用了精彩的Profiler工具。是否有类似于Oracle的东西?

12 个答案:

答案 0 :(得分:21)

您可以使用Oracle企业管理器来监视活动会话,包括正在执行的查询,执行计划,锁定,某些统计信息以及更长任务的进度条。

请参阅:http://download.oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955

转到实例 - >会话并观察每个会话的SQL选项卡。

还有其他方法。企业管理员只需要在特殊视图中提供的颜色很漂亮,如下所示: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage

当然,您也可以使用Explain PLAN FOR,TRACE工具和其他许多工具化方法。企业管理器中有一些报告可以查找最昂贵的SQL查询。您还可以搜索缓存中保留的最近查询。

答案 1 :(得分:15)

我找到了一个简单的解决方案

步骤1。使用PLSQL或sqldeveloper或任何其他查询接口

与管理员用户连接到DB

第二步。以下脚本运行;在S.SQL_TEXT列中,您将看到执行的查询

SELECT            
 S.LAST_ACTIVE_TIME,     
 S.MODULE,
 S.SQL_FULLTEXT, 
 S.SQL_PROFILE,
 S.EXECUTIONS,
 S.LAST_LOAD_TIME,
 S.PARSING_USER_ID,
 S.SERVICE                                                                       
FROM
 SYS.V_$SQL S, 
 SYS.ALL_USERS U
WHERE
 S.PARSING_USER_ID=U.USER_ID 
 AND UPPER(U.USERNAME) IN ('oracle user name here')   
ORDER BY TO_DATE(S.LAST_LOAD_TIME, 'YYYY-MM-DD/HH24:MI:SS') desc;

唯一的问题是我找不到显示输入参数值的方法(对于函数调用),但至少我们可以看到Oracle中运行的内容及其顺序而不使用特定工具

答案 2 :(得分:14)

alter system set timed_statistics=true

- 或

alter session set timed_statistics=true --if want to trace your own session

- 必须足够大:

select value from v$parameter p
where name='max_dump_file_size' 

- 找出您感兴趣的会话的sid和序列号:

 select sid, serial# from v$session
 where ...your_search_params...

- 您可以开始跟踪10046事件,第四个参数设置跟踪级别(12是最大的):

 begin
    sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
 end;

- 设置零级别关闭跟踪:

begin
   sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
end;

/ *可能的级别: 0 - 关闭 1 - 最低级别。很像set sql_trace = true 4 - 将绑定变量值添加到跟踪文件中 8 - 添加等待 12 - 添加绑定变量值和等待事件 * /

- 如果您想跟踪更高级别的会话,也是如此:

alter session set events '10046 trace name context forever, level 12';

- 关闭:

alter session set events '10046 trace name context off';

- 具有原始跟踪信息的文件将位于:

 select value from v$parameter p
 where name='user_dump_dest'

- 文件名(* .trc)将包含spid:

 select p.spid from v$session s, v$process p
 where s.paddr=p.addr
 and ...your_search_params...

- 您也可以自己设置名称:

alter session set tracefile_identifier='UniqueString'; 

- 最后,使用TKPROF使跟踪文件更具可读性:

C:\ORACLE\admin\databaseSID\udump>
C:\ORACLE\admin\databaseSID\udump>tkprof my_trace_file.trc output=my_file.prf
TKPROF: Release 9.2.0.1.0 - Production on Wed Sep 22 18:05:00 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
C:\ORACLE\admin\databaseSID\udump>

- 查看跟踪文件使用状态:

set serveroutput on size 30000;
declare
  ALevel binary_integer;
begin
  SYS.DBMS_SYSTEM.Read_Ev(10046, ALevel);
  if ALevel = 0 then
    DBMS_OUTPUT.Put_Line('sql_trace is off');
  else
    DBMS_OUTPUT.Put_Line('sql_trace is on');
  end if;
end;
/

只是有点翻译http://www.sql.ru/faq/faq_topic.aspx?fid=389原版更全面,但无论如何这比其他人发布的恕我直言更好

答案 3 :(得分:5)

尝试PL / SQL Developer它有一个很好的用户友好的GUI界面到分析器。尝试一下这个试验非常好。在使用Oracle数据库时,我发誓这个工具。

http://www.allroundautomations.com/plsqldev.html?gclid=CM6pz8e04p0CFQjyDAodNXqPDw

答案 4 :(得分:4)

看到我刚刚将最近的一个问题作为重复投票,并指出了这个方向。 。

更多 - 在SQL * Plus中 - SET AUTOTRACE ON - 将为每个执行的语句提供解释计划和统计信息。

TOAD还允许进行客户端分析。

这两个方面的缺点是它们只告诉你语句的执行计划,而不是优化器如何达到该计划 - 因为你需要更低级别的服务器端跟踪。

另一个需要了解的重要事项是Statspack快照 - 它们是查看整个数据库性能的好方法。解释计划等擅长查找瓶颈的单个SQL语句。 Statspack擅长确定你的问题是,一个简单的执行计划声明在一分钟内被调用了100万次。

答案 5 :(得分:4)

GI Oracle Profiler v1.2

这是一个Oracle工具,用于捕获与SQL Server Profiler类似的执行查询。   维护使用此数据库服务器的应用程序的必不可少的工具。

您可以从官方网站iacosoft.com下载

答案 6 :(得分:2)

试试这个(它也是免费的): http://www.aboves.com/Statement_Tracer_for_Oracle.exe

答案 7 :(得分:2)

Catch是捕获两个时间点之间的所有SQL运行。就像SQL Server一样。

在某些情况下,捕获特定用户在数据库中运行的SQL很有用。通常,您只需为该用户启用会话跟踪,但该方法存在两个潜在问题。

  1. 首先,许多基于Web的应用程序维护一个在多个用户之间共享的持久数据库连接池。
  2. 第二个是某些应用程序连接,运行一些SQL并非常快速地断开连接,使得启用会话跟踪变得棘手(在这种情况下,您当然可以使用登录触发器启用会话跟踪)。
  3. 问题的快速而肮脏的解决方案是捕获在两个时间点之间运行的所有SQL语句。

    以下过程将创建两个表,每个表包含特定点的数据库快照。然后将查询这些表以生成该期间内所有SQL运行的列表。

    如果可能,您应该在安静的开发系统上执行此操作 - 否则您可能会冒回太多数据。

    1. 拍摄第一张快照 运行以下sql以创建第一个快照:

      create table sql_exec_before as
      select executions,hash_value
      from v$sqlarea
      /
      
    2. 让用户在应用程序中执行任务。

    3. 拍摄第二张快照。

      create table sql_exec_after as
      select executions, hash_value
      from v$sqlarea
      /
      
    4. 检查结果 现在您已经捕获了SQL,现在可以查询结果了。

    5. 第一个查询将列出已执行的所有查询哈希:

      select  aft.hash_value
      from sql_exec_after aft
      left outer join sql_exec_before bef
        on aft.hash_value  =  bef.hash_value 
      where aft.executions > bef.executions
         or bef.executions is null;
      /
      

      这个将显示哈希和SQL本身: 设置页面999行100 中断hash_value

      select  hash_value, sql_text
      from    v$sqltext
      where   hash_value in (
          select  aft.hash_value
          from sql_exec_after aft
          left outer join sql_exec_before bef
            on aft.hash_value  =  bef.hash_value
          where aft.executions > bef.executions
             or bef.executions is null;
      )
      order by
          hash_value, piece
      /
      

      5。 整理完成后不要忘记删除快照表:

      drop table sql_exec_before
      /
      
      drop table sql_exec_after
      /
      

答案 8 :(得分:1)

Oracle与其他数据库一起分析给定查询以创建执行计划。该计划是检索数据的最有效方式。

Oracle提供了“explain plan”语句,该语句分析查询但不运行它,而是填充一个可以查询的特殊表(计划表)。

语法(简单版本,还有其他选项,例如使用特殊ID标记计划表中的行,或使用不同的计划表):

explain plan for <sql query>

对该数据的分析留待另一个问题或您的进一步研究。

答案 9 :(得分:1)

有一个商业工具FlexTracer可用于跟踪Oracle SQL查询

答案 10 :(得分:0)

这是一篇Oracle文档,解释了如何跟踪SQL查询,包括一些工具(SQL Trace和tkprof)

link

答案 11 :(得分:0)

显然,没有一个简单的廉价实用程序可以帮助执行此任务。然而,有一种方法可以以复杂和不方便的方式进行。

以下文章介绍了几个。可能还有几十个...... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm