2008-09-29 170 views
65

我使用sql server,但我必须迁移到带有Oracle DB的应用程序。 用于跟踪我的应用程序查询,在Sql Server中我使用了美妙的Profiler工具。对于Oracle来说有没有相同的东西?Oracle:是否有跟踪查询的工具,如用于sql server的Profiler?

+33

你为什么接受错误的答案?解释计划不会做分析器的工作。这完全没有关系。 – Jasmine 2013-05-07 20:46:04

+1

你有没有找到像`sql server profiler`这样的最佳工具?你现在在用什么? – 2015-09-18 09:43:55

+0

我写了一本关于跟踪Oracle应用程序的书。它可以通过http://method-r.com以PDF格式获得。 – 2016-02-11 16:26:21

回答

1

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

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

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

explain plan for <sql query> 

该数据的分析留给另一个问题,或者你的进一步研究。

0

这是Oracle文档,说明如何跟踪SQL查询,其中包括一对夫妇的工具(SQL跟踪和TKPROF)

link

19

您可以使用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

,当然你也可以使用解释计划,跟踪工具和大量的工具化的其他方式:企业经理只是漂亮的颜色是什么样的记录在这里特别的观点已经可以提出。企业管理器中有一些关于最昂贵的SQL查询的报告。您还可以搜索保存在缓存中的最近查询。

5

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

+5

我试图使用这个软件,但我看不到配置连接字符串的方法。谁能帮忙? – 2014-02-21 15:33:13

+0

太棒了!工程很漂亮......但据我只能告诉数据库的本地主机。 – vmassuchetto 2014-09-22 15:58:46

+6

这是一个可执行文件的链接 - 非常不错! – 2015-08-24 22:35:36

4

看到,因为我刚刚投了最近的问题是重复的,并在此指明方向。 。 。

更夫妇 - 在SQL * Plus - SET AUTOTRACE ON - 将给予解释计划和统计,每条语句执行。

蟾蜍还允许客户端分析。

这两个的缺点是,他们只告诉你该语句的执行计划,但不知道如何到达该计划优化器 - 为您将需要较低级别的服务器端跟踪。

另一个重要的理解是Statspack快照 - 它们是查看整个数据库性能的好方法。解释计划等,善于发现个别的SQL语句是瓶颈。 Statspack擅长识别你的问题,即一个简单的声明和一个良好的执行计划在一分钟内被称为100万次。

2

美中不足的是捕获两个点之间的所有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 
/
13
alter system set timed_statistics=true 

--or

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 - 无论是绑定变量值和等待事件被添加 */

如果你想跟踪

--same你自己的会话与更大级别:

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

- 转向关:

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

--file与原始跟踪信息将位于:

01 (*。TRC)
select value from v$parameter p 
where name='user_dump_dest' 

文件的--name将包含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'; 

--finally,使用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> 

--to视图TRA的状态CE文件使用:

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原来是更全面的,但无论如何,这是比别人贴恕我直言

13

我发现了一个简单的解决方案

第一步更好。使用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中运行并且没有使用特定工具的顺序。

4

GI Oracle Profiler v1.2

这是一个工具甲骨文捕捉到类似SQL Server事件探查执行的查询。 维护使用此数据库服务器的应用程序不可或缺的工具。

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

相关问题