Oracle:是否有用于跟踪查询的工具,例如用于SQL Server的Profiler?[关闭]


84

我使用sql server,但必须使用Oracle DB迁移到应用程序。为了跟踪我的应用程序查询,在Sql Server中,我使用了出色的Profiler工具。Oracle有什么等效的东西吗?


38
你为什么接受错误的答案?解释计划不执行探查器。这是完全无关的。
茉莉花

1
您找到最佳工具了sql server profiler吗?您现在在用什么?
Shahid Ghafoor

我已经写了一本关于跟踪Oracle应用程序的书。可通过method-r.com以PDF格式获得
Cary Millsap

请从Devart签出dbForge Studio for Oracle中的oracle profiler
Devart '18

下面有很多答案,但奇怪的是没有人提到Oracle的两个PL / SQL探查器:(DBMS_PROFILER基本和有限,但超级方便)或DBMS_HPROF(更准确,但需要更多设置)。但是,我不知道SQL Server,因此它可能具有与任何一个Oracle软件包都不相同的概要分析概念,并且您想要的更像是在Oracle中进行跟踪。
威廉·罗伯逊

Answers:


22

您可以使用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查询。您还可以搜索缓存中保留的最近查询。


17

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

步骤1。使用PLSQL或sqldeveloper或任何其他查询界面与管理员用户连接到DB

第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中运行的内容及其顺序,而无需使用特定的工具。


2
如果查询文本超过1000个字符,则可以添加S.SQL_FULLTEXT,因为此时SQL_TEXT被切断。
Tridus

2
您不应在LAST_ACTIVE_TIME之前订购,因为它是VARCHAR2(19)。请改用此命令:ORDER BY TO_DATE(S.LAST_LOAD_TIME,'YYYY-MM-DD / HH24:MI:SS')desc
Igor Krupitsky '17

1
ORA-00942:表或视图不存在00942。00000-“表或视图不存在” *原因:*操作:第11行的错误:列:6这是否意味着我没有管理员权限?
托哈

这不包括参数值。如果您也想拥有它,请查看:stackoverflow.com/a/14217618/6339469
HamedH

16
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原始版本比较完整,但是无论如何,这比其他人发布的恕我直言要好


比其他答案有用得多!
Andomar 2015年

太复杂。没有人会使用它。
ADM-IT

7

GI Oracle Profiler v1.2

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

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


嗨,您需要ORACLE的特殊许可证才能使用此软件吗?我知道Oracle允许您询问某些表/视图,如果您这样做并且没有许可证,他们会向您收取额外费用。
sergiu 2014年

2
嗨,您必须付费才能查询v $ sqlarea?我可以输入说什么的链接?
pio

非常感谢男人!您节省了我很多工作
Hernaldo Gonzalez

如果我的查询失败,则探查器不会显示它。
ADM-IT


5

就像我刚刚对一个最近的问题投了重复一样,并指出了这个方向。。。

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

TOAD还允许客户端分析。

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

另一个重要的要了解的是Statspack快照-它们是查看整个数据库性能的好方法。说明计划等擅长查找瓶颈的单个SQL语句。Statspack擅长于识别您的问题所在,即一个具有良好执行计划的简单语句在一分钟内被调用一百万次。


3

捕获是捕获两个时间点之间的所有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行,hash_value中断100

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
/

感谢您演示该技术的完整脚本。
Roman Pokrovskij 2014年

2

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

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

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

explain plan for <sql query>

该数据的分析还有其他问题,或您需要进一步研究。



1

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

链接


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.