【问题标题】:Oracle: is there a tool to trace queries, like Profiler for sql server? [closed]Oracle:是否有跟踪查询的工具,例如 Profiler for sql server? [关闭]
【发布时间】:2010-09-14 00:01:53
【问题描述】:

我使用 sql server,但我必须迁移到使用 Oracle DB 的应用程序。 为了跟踪我的应用程序查询,我在 Sql Server 中使用了很棒的 Profiler 工具。甲骨文有类似的东西吗?

【问题讨论】:

  • 您为什么接受了错误的答案?解释计划不做分析器所做的事情。这完全无关。
  • 你找到像sql server profiler这样的最佳工具了吗?你现在用什么?
  • 我写了一本关于跟踪 Oracle 应用程序的书。可通过method-r.com 获取 PDF 格式。
  • 请查看来自 Devart 的 dbForge Studio for Oracle 中的 oracle profiler
  • 下面有很多答案,但奇怪的是没有人提到 Oracle 的 两个 PL/SQL 分析器中的任何一个:DBMS_PROFILER(基本且有限,但超级方便)或DBMS_HPROF(更准确但需要更多设置)。但是,我不了解 SQL Server,因此它可能具有与任何一个 Oracle 包不同的分析概念,而您想要的更像是在 Oracle 中进行跟踪。

标签: sql-server oracle profiler


【解决方案1】:

您可以使用 Oracle Enterprise Manager 监控活动会话,包括正在执行的查询、其执行计划、锁定、一些统计信息,甚至是较长任务的进度条。

见: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 查询的报告。您还可以搜索保存在缓存中的最近查询。

【讨论】:

    【解决方案2】:

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

    步骤 1。使用 PLSQL 或 sqldeveloper 或任何其他查询接口与管理员用户连接到数据库

    步骤 2。运行下面的脚本;在 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 中运行的内容及其顺序.

    【讨论】:

    • 如果查询文本超过 1000 个字符,您可以添加 S.SQL_FULLTEXT,因为此时 SQL_TEXT 会被截断。
    • 您不应该在 LAST_ACTIVE_TIME 之前订购,因为它是 VARCHAR2(19)。改用这个: ORDER BY TO_DATE(S.LAST_LOAD_TIME, 'YYYY-MM-DD/HH24:MI:SS') desc
    • ORA-00942:表或视图不存在 00942. 00000 - “表或视图不存在” *原因:*操作:第 11 列错误:6 是否意味着我有没有管理员权限?
    • 这不包括参数值。如果您也想拥有它,请查看:stackoverflow.com/a/14217618/6339469
    【解决方案3】:
    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 - 最低级别。很像设置 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 原文更完整,但无论如何这比其他人发布的恕我直言要好

    【讨论】:

    • 比其他答案有用得多!
    • 太复杂了。没有人会使用它。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      1. 首先是许多基于 Web 的应用程序维护一个持久数据库连接池,这些连接在多个用户之间共享。
      2. 第二个是一些应用程序连接、运行一些 SQL 和断开连接的速度非常快,这使得完全启用会话跟踪变得很棘手(在这种情况下,您当然可以使用登录触发器来启用会话跟踪)。

      该问题的快速而肮脏的解决方案是捕获在两个时间点之间运行的所有 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,是时候查询结果了。

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

      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
      /
      

      【讨论】:

      • 感谢您提供演示该技术的完整脚本。
      • 您好,请问这个查询是什么时候执行的?
      【解决方案6】:

      GI Oracle Profiler v1.2

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

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

      【讨论】:

      • 您好,您需要 ORACLE 的特殊许可证才能使用此软件吗?我知道 Oracle 允许您查询某些表/视图,如果您这样做并且没有许可证,他们会向您收取额外费用。
      • 您好,查询v$sqlarea需要付费吗?我可以输入说明什么的链接?
      • 非常感谢伙计!!!你为我节省了很多工作
      • 如果我的查询失败,分析器不会显示它。
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

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

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

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

        另一个需要理解的重要内容是 Statspack 快照 - 它们是查看整个数据库性能的好方法。解释计划等,擅长发现个别的 SQL 语句是瓶颈。 Statspack 擅长识别您的问题是具有良好执行计划的简单语句在一分钟内被调用 100 万次。

        【讨论】:

          【解决方案9】:

          试试 PL/SQL Developer,它有一个很好的用户友好的 GUI 界面到分析器。试一试很不错。在处理 Oracle 数据库时,我对这个工具发誓。

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

          【讨论】:

            【解决方案10】:

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

            link

            【讨论】:

              【解决方案11】:

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

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

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

              explain plan for <sql query>
              

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-05-25
                • 1970-01-01
                • 2011-06-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多