2008-09-29 171 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它

相關問題