甲骨文:有没有一个工具来跟踪查询,如SQL Server的分析器?
我使用SQL服务器,但我必须迁移到与Oracle数据库的应用程序。 为了跟踪我的应用程序查询,我在Sql Server中使用了美妙的Profiler工具。 有没有相当于Oracle的东西?
您可以使用Oracle企业pipe理器来监视正在执行的查询,执行计划,locking,一些统计信息甚至是长期任务的进度条。
请参阅: http : //download.oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955
转到实例 – >会话,并观看每个会话的SQL选项卡。
还有其他的方法。 企业经理只是把漂亮的颜色放在什么特殊的意见,如在这里logging: http : //www.oracle.com/pls/db92/db92.catalog_views? remark=homepage
当然你也可以使用Explain PLAN FOR,TRACE工具和其他的工具化方法。 企业pipe理器中有一些关于最昂贵的SQL查询的报告。 您还可以searchcaching中最近的查询。
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;
– closures跟踪设置零水平:
begin sys.dbms_system.set_ev(sid, serial#, 10046, 0, ''); end;
/ *可能的级别:0 – closures1 – 最低级别。 很像set sql_trace = true 4 – 绑定variables值被添加到跟踪文件8 – 等待被添加12 – 绑定variables值和等待事件都被添加* /
– 如果你想跟踪更大的水平你自己的会议:
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原来是更完整的,但无论如何,这是比别人发布恕我直言;
我发现一个简单的解决scheme
步骤1。 用pipe理员用户使用PLSQL或sqldeveloper或任何其他查询接口连接到数据库
第2步。 运行剧本的波纹pipe; 在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;
唯一的问题是,我找不到一种方法来显示input参数值(对于函数调用),但至less我们可以看到在Oracle中运行的是什么以及它的顺序,而不使用特定的工具。
试试这个(它也是免费的): http : //www.aboves.com/Statement_Tracer_for_Oracle.exe
看到我刚刚把最近的一个问题投了一个副本,并指出了这个方向。 。 。
另外一些 – 在SQL * Plus中 – SET AUTOTRACE ON – 将为每个执行的语句提供解释计划和统计信息。
TOAD也允许客户端分析。
这两者的缺点是,他们只告诉你这个语句的执行计划,而不是这个优化器是如何到达这个计划的 – 因为你需要更低级别的服务器端跟踪。
另一个需要了解的重要问题是Statspack快照 – 它们是查看整个数据库性能的好方法。 解释计划等,善于发现个别的SQL语句是瓶颈。 Statspack很擅长识别你的问题,一个简单的语句和一个好的执行计划在一分钟内被称为100万次。
GI Oracle Profiler v1.2
这是Oracle的工具,用于捕获执行类似于SQL Server Profiler的查询。 维护使用此数据库服务器的应用程序的不可或缺的工具。
你可以从官方网站iacosoft.com下载
尝试PL / SQL Developer它有一个很好的用户界面友好的graphics界面。 试用一下就可以了。 在Oracle数据库上工作时,我发誓这个工具。
http://www.allroundautomations.com/plsqldev.html?gclid=CM6pz8e04p0CFQjyDAodNXqPDw
Catch捕获两个时间点之间运行的所有SQL。 就像SQL Server也一样。
在某些情况下,捕获特定用户在数据库中运行的SQL很有用。 通常您只需为该用户启用会话跟踪,但该方法存在两个潜在的问题。
- 首先,许多基于Web的应用程序都维护一个由多个用户共享的永久数据库连接池。
- 第二个是有些应用程序连接,运行一些SQL,并且很快断开连接,这使得根本无法启用会话跟踪(当然,在这种情况下,您可以使用login触发器来启用会话跟踪)。
这个问题的一个快速和肮脏的解决scheme是捕获在两个时间点之间运行的所有SQL语句。
以下过程将创build两个表,每个表包含特定点上的数据库快照。 然后查询这些表以产生在此期间所有SQL运行的列表。
如果可能的话,你应该在一个安静的开发系统上这样做 – 否则你可能会冒太多的风险。
-
采取第一个快照运行下面的SQL来创build第一个快照:
create table sql_exec_before as select executions,hash_value from v$sqlarea /
-
让用户在应用程序中执行他们的任务。
-
拿第二个快照。
create table sql_exec_after as select executions, hash_value from v$sqlarea /
-
检查结果现在已经捕获了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中断
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 /
Oracle与其他数据库一起分析给定的查询以创build执行计划。 这个计划是检索数据的最有效的方法。
Oracle提供了分析查询的“ explain plan
”语句,但不运行它,而是填充可以查询的特殊表(计划表)。
语法(简单的版本,还有其他选项,例如用特殊的ID标记计划表中的行,或者使用不同的计划表)是:
explain plan for <sql query>
对这些数据的分析还有另一个问题,或者您的进一步研究。
有一个商业工具FlexTracer可以用来跟踪Oracle SQL查询
这是一个Oracle文档,解释如何跟踪SQL查询,包括几个工具(SQL Trace和tkprof)
链接
显然没有一个简单便宜的工具可以帮助你完成这个任务。 然而,复杂和不方便的方法还有101种方法。
以下文章介绍了几个。 有可能有几十… http://www.petefinnigan.com/ramblings/how_to_set_trace.htm