我使用 sql server,但我必须迁移到使用 Oracle DB 的应用程序。为了跟踪我的应用程序查询,我在 Sql Server 中使用了很棒的 Profiler 工具。甲骨文有类似的东西吗?
11 回答
我找到了一个简单的解决方案
步骤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 中运行的内容及其顺序。
您可以使用 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 查询的报告。您还可以搜索保存在缓存中的最近查询。
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 - 添加绑定变量值和等待事件 */
--same 如果你想用更大的级别跟踪你自己的会话:
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';
--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>
--查看跟踪文件使用的状态:
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原文更完整,但无论如何这比其他人发布的恕我直言
它是一种用于 Oracle 的工具,用于捕获类似于 SQL Server Profiler 执行的查询。用于维护使用此数据库服务器的应用程序的不可或缺的工具。
您可以从官方网站 iacosoft.com 下载它
试试 PL/SQL Developer,它对分析器有一个很好的用户友好的 GUI 界面。试一试很不错。在处理 Oracle 数据库时,我对这个工具发誓。
http://www.allroundautomations.com/plsqldev.html?gclid=CM6pz8e04p0CFQjyDAodNXqPDw
看到我刚刚将最近的一个问题投票为重复并指出了这个方向。. .
更多 - 在 SQL*Plus - SET AUTOTRACE ON - 将为每个执行的语句提供解释计划和统计信息。
TOAD 还允许进行客户端分析。
这两者的缺点是它们只告诉您语句的执行计划,而不是优化器如何到达该计划 - 因为您将需要较低级别的服务器端跟踪。
另一个需要理解的重要内容是 Statspack 快照——它们是查看整个数据库性能的好方法。解释计划等,擅长发现个别的 SQL 语句是瓶颈。Statspack 擅长识别您的问题是一个具有良好执行计划的简单语句在一分钟内被调用 100 万次这一事实。
Catch 是捕获两个时间点之间运行的所有 SQL。就像 SQL Server 一样。
在某些情况下,捕获特定用户在数据库中运行的 SQL 很有用。通常您只需为该用户启用会话跟踪,但该方法存在两个潜在问题。
- 首先是许多基于 Web 的应用程序维护一个在多个用户之间共享的持久数据库连接池。
- 第二个是一些应用程序连接、运行一些 SQL 和断开连接非常快,这使得完全启用会话跟踪变得很棘手(在这种情况下,您当然可以使用登录触发器来启用会话跟踪)。
该问题的一个快速而肮脏的解决方案是捕获在两个时间点之间运行的所有 SQL 语句。
以下过程将创建两个表,每个表都包含数据库在特定点的快照。然后将查询这些表以生成在此期间运行的所有 SQL 的列表。
如果可能,您应该在安静的开发系统上执行此操作 - 否则您可能会获取太多数据。
拍摄第一个快照 运行以下 sql 创建第一个快照:
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 本身: set pages 999 lines 100 break on 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
/
Oracle 与其他数据库一起分析给定查询以创建执行计划。此计划是检索数据的最有效方式。
Oracle 提供了 ' explain plan
' 语句,它分析查询但不运行它,而是填充一个您可以查询的特殊表(计划表)。
语法(简单版本,还有其他选项,例如使用特殊 ID 标记计划表中的行,或使用不同的计划表)是:
explain plan for <sql query>
该数据的分析留给另一个问题或您的进一步研究。
有一个商业工具FlexTracer可用于跟踪 Oracle SQL 查询
Apparently there is no small simple cheap utility that would help performing this task. There is however 101 way to do it in a complicated and inconvenient manner.
Following article describes several. There are probably dozens more... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm
这是一个 Oracle 文档,解释如何跟踪 SQL 查询,包括几个工具(SQL Trace 和 tkprof)