Oracle : SQL Server 용 프로파일 러와 같은 쿼리를 추적하는 도구가 있습니까? [닫은]


84

SQL 서버로 작업하지만 Oracle DB가있는 애플리케이션으로 마이그레이션해야합니다. 내 응용 프로그램 쿼리를 추적하기 위해 Sql Server에서 멋진 프로파일 러 도구를 사용합니다. 오라클에 상응하는 것이 있습니까?


38
왜 오답을 받아들였습니까? 계획은 프로파일 러가하는 일을하지 않습니다. 완전히 관련이 없습니다.
Jasmine

1
같은 최고의 도구를 찾았 sql server profiler습니까? 지금 무엇을 사용하고 있습니까?
Shahid Ghafoor

Oracle 애플리케이션 추적에 대한 책을 썼습니다. method-r.com 에서 PDF 형식으로 제공 됩니다.
Cary Millsap

Devart의 dbForge Studio for Oracle에서 Oracle 프로파일 러 를 확인하십시오 .
Devart

아래에 많은 답변이 있지만 이상하게도 아무도 PL / SQL 용 Oracle의 두 가지 프로파일 러 인 DBMS_PROFILER(기본적이고 제한적이지만 매우 편리함) 또는 DBMS_HPROF(더 정확하지만 더 많은 설정이 필요함 ) 중 하나를 언급하지 않았습니다 . 그러나 SQL Server를 모르기 때문에 Oracle 패키지 중 하나와 프로파일 링 개념이 다를 수 있으며 원하는 것은 Oracle의 추적과 비슷합니다.
William Robertson

답변:


22

Oracle Enterprise Manager를 사용하여 실행중인 쿼리, 실행 계획, 잠금, 일부 통계 및 더 긴 작업에 대한 진행률 표시 줄과 함께 활성 세션을 모니터링 할 수 있습니다.

참조 : http://download.oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955

인스턴스-> 세션으로 이동하여 각 세션의 SQL 탭을 확인하십시오.

다른 방법이 있습니다. Enterprise Manager는 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 2016 년

2
VARCHAR2 (19)이므로 LAST_ACTIVE_TIME까지 주문하면 안됩니다. 대신 사용하세요 : ORDER BY TO_DATE (S.LAST_LOAD_TIME, 'YYYY-MM-DD / HH24 : MI : SS') desc
Igor Krupitsky

1
ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다 00942. 00000- "테이블 또는 뷰가 존재하지 않습니다"* 원인 : * Action : 라인에 오류 : 11 컬럼 : 6 그것은 내가 관리자 권한이 없음을 의미합니까?
toha

여기에는 매개 변수 값이 포함되지 않습니다. 그것도 갖고 싶다면 다음을 살펴보십시오 : 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;

-0 레벨을 설정하여 추적을 끕니다.

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 원본은 더 꽉 차 있지만 어쨌든 다른 사람이 IMHO를 게시 한 것보다 낫습니다.


다른 답변보다 훨씬 유용합니다!
Andomar

너무 복잡한. 아무도 그것을 사용하지 않을 것입니다.
ADM-IT

7

GI Oracle Profiler v1.2

SQL Server 프로파일 러와 유사하게 실행되는 쿼리를 캡처하는 Oracle 용 도구입니다. 이 데이터베이스 서버를 사용하는 응용 프로그램의 유지 관리에 필수적인 도구입니다.

공식 사이트 iacosoft.com에서 다운로드 할 수 있습니다.


안녕하세요,이 소프트웨어를 사용하려면 ORACLE의 특별 라이센스가 필요합니까? 오라클이 특정 테이블 / 뷰를 통합 할 수 있도록 허용하고 있으며,이를 수행하고 이에 대한 라이선스가없는 경우 추가 요금을 부과합니다.
세르주

2
안녕하세요, v $ sqlarea를 쿼리하려면 비용을 지불해야합니까? 무엇을 말하는 링크를 입력 할 수 있습니까?
PIO

탁월한 감사합니다! 당신은 나에게 많은 작업 저장
Hernaldo 곤잘레스

내 쿼리가 실패하면 프로파일 러에 표시되지 않습니다.
ADM-IT


5

내가 최근 질문을 중복으로 투표 하고이 방향을 지적한 것처럼 보았습니다. . .

SQL * Plus에서-SET AUTOTRACE ON-실행 된 각 명령문에 대한 설명 계획 및 통계를 제공합니다.

TOAD는 또한 클라이언트 측 프로파일 링을 허용합니다.

이 두 가지의 단점은 명령문에 대한 실행 계획 만 알려주지 만 옵티마이 저가 해당 계획에 어떻게 도달했는지는 알려주지 않는다는 것입니다. 낮은 수준의 서버 측 추적이 필요하기 때문입니다.

이해해야 할 또 다른 중요한 것은 Statspack 스냅 샷입니다. 전체적으로 데이터베이스의 성능을 살펴볼 수있는 좋은 방법입니다. Explain plan 등은 병목 현상이있는 개별 SQL 문을 찾는 데 유용합니다. Statspack은 좋은 실행 계획이있는 간단한 명령문이 1 분에 백만 번 호출된다는 사실을 식별하는 데 능숙합니다.


3

Catch는 두 시점 사이에 실행되는 모든 SQL 캡처입니다. SQL Server도 마찬가지입니다.

특정 사용자가 데이터베이스에서 실행중인 SQL을 캡처하는 것이 유용한 상황이 있습니다. 일반적으로 해당 사용자에 대해 단순히 세션 추적을 사용하도록 설정하지만 해당 접근 방식에는 두 가지 잠재적 인 문제가 있습니다.

  1. 첫 번째는 많은 웹 기반 애플리케이션이 여러 사용자간에 공유되는 영구 데이터베이스 연결 풀을 유지한다는 것입니다.
  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 자체를 표시합니다 : hash_value에서 페이지 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
/

기술을 보여주는 완전한 스크립트에 감사드립니다.
Roman Pokrovskij 2014

2

Oracle은 다른 데이터베이스와 함께 주어진 쿼리를 분석하여 실행 계획을 만듭니다. 이 계획은 데이터를 검색하는 가장 효율적인 방법입니다.

Oracle은 explain plan쿼리를 분석하지만 실행하지 않는 ' '문을 제공하고 대신 쿼리 할 수있는 특수 테이블 (계획 테이블)을 채 웁니다.

구문 (단순 버전, 특수 ID로 계획 테이블의 행을 표시하거나 다른 계획 테이블을 사용하는 것과 같은 다른 옵션이 있음)은 다음과 같습니다.

explain plan for <sql query>

해당 데이터의 분석은 다른 질문이나 추가 연구를 위해 남겨집니다.



1

이것은 몇 가지 도구 (SQL Trace 및 tkprof)를 포함하여 SQL 쿼리를 추적하는 방법을 설명하는 Oracle 문서입니다.

링크


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.