Oracle: czy istnieje narzędzie do śledzenia zapytań, takie jak Profiler for sql server? [Zamknięte]

85

Pracuję z serwerem sql, ale muszę przeprowadzić migrację do aplikacji z Oracle DB. do śledzenia zapytań aplikacji w Sql Server używam wspaniałego narzędzia Profiler. czy jest coś równoważnego dla Oracle?

stefano m
źródło
38
Dlaczego przyjąłeś złą odpowiedź? Wyjaśnij, że plan NIE robi tego, co robi profiler. To zupełnie niezwiązane.
Jasmine
1
czy znalazłeś najlepsze narzędzie sql server profiler? czego teraz używasz?
Shahid Ghafoor
Napisałem książkę o śledzeniu aplikacji Oracle. Jest dostępny w formacie PDF pod adresem method-r.com .
Cary Millsap,
Proszę, sprawdź Oracle Profiler w dbForge Studio for Oracle od Devart.
Devart
Wiele odpowiedzi poniżej, ale o dziwo nikt nie wspomniał o żadnym z dwóch profilerów Oracle dla PL / SQL: DBMS_PROFILER(podstawowy i ograniczony, ale super wygodny) lub DBMS_HPROF(dokładniejszy, ale wymaga więcej konfiguracji). Jednak nie znam SQL Server, więc możliwe, że ma inną koncepcję profilowania niż którykolwiek z pakietów Oracle, a to, czego potrzebujesz, przypomina śledzenie w Oracle.
William Robertson

Odpowiedzi:

22

Możesz użyć Oracle Enterprise Manager do monitorowania aktywnych sesji, z wykonywanym zapytaniem, jego planem wykonania, blokadami, niektórymi statystykami, a nawet paskiem postępu dla dłuższych zadań.

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

Przejdź do Instancja -> sesje i obserwuj zakładkę SQL każdej sesji.

Są inne sposoby. Menedżer przedsiębiorstwa po prostu dodaje ładnymi kolorami to, co jest już dostępne w widokach specjalnych, takich jak te udokumentowane tutaj: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage

Oczywiście możesz także skorzystać z narzędzia Explain PLAN FOR, TRACE i wielu innych sposobów instrumentalizacji. W menedżerze przedsiębiorstwa znajduje się kilka raportów dotyczących najbardziej kosztownych zapytań SQL. Możesz również przeszukiwać ostatnie zapytania przechowywane w pamięci podręcznej.

borjab
źródło
18

Znalazłem proste rozwiązanie

Krok 1. połącz się z DB z administratorem za pomocą PLSQL lub sqldeveloper lub dowolnego innego interfejsu zapytań

Krok 2. uruchom skrypt poniżej; w kolumnie S.SQL_TEXT zobaczysz wykonane zapytania

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;

Jedynym problemem jest to, że nie mogę znaleźć sposobu na pokazanie wartości parametrów wejściowych (dla wywołań funkcji), ale przynajmniej możemy zobaczyć, co jest uruchamiane w Oracle i kolejność bez użycia określonego narzędzia.

sergiu
źródło
2
Możesz dodać S.SQL_FULLTEXT, jeśli tekst zapytania ma ponad 1000 znaków, ponieważ SQL_TEXT zostanie ucięty w tym momencie.
Tridus
2
Nie należy zamawiać do LAST_ACTIVE_TIME, ponieważ jest to VARCHAR2 (19). Użyj tego zamiast tego: ORDER BY TO_DATE (S.LAST_LOAD_TIME, 'YYYY-MM-DD / HH24: MI: SS') desc
Igor Krupitsky,
1
ORA-00942: tabela lub widok nie istnieje 00942. 00000 - „tabela lub widok nie istnieje” * Przyczyna: * Akcja: Błąd w wierszu: 11 Kolumna: 6 Czy to oznacza, że ​​nie mam uprawnień administratora?
toha
Nie obejmuje to wartości parametrów. jeśli chcesz to mieć, spójrz na: stackoverflow.com/a/14217618/6339469
HamedH
16
alter system set timed_statistics=true

--lub

alter session set timed_statistics=true --if want to trace your own session

- musi być wystarczająco duży:

select value from v$parameter p
where name='max_dump_file_size' 

- Sprawdź numer identyfikacyjny i numer seryjny sesji, która Cię interesuje:

 select sid, serial# from v$session
 where ...your_search_params...

- możesz rozpocząć śledzenie od zdarzenia 10046, czwarty parametr ustawia poziom śledzenia (12 jest największy):

 begin
    sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
 end;

- wyłącz śledzenie z ustawieniem poziomu zerowego:

begin
   sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
end;

/ * możliwe poziomy: 0 - wyłączone 1 - minimalny poziom. Podobnie jak set sql_trace = true 4 - wartości zmiennych powiązań są dodawane do pliku śledzenia 8 - dodawane są oczekiwania 12 - dodawane są zarówno wartości zmiennych wiązania, jak i zdarzenia oczekiwania * /

- to samo, jeśli chcesz śledzić własną sesję na wyższym poziomie:

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

--wyłączyć:

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

--plik z nieprzetworzonymi informacjami o śledzeniu zostanie zlokalizowany:

 select value from v$parameter p
 where name='user_dump_dest'

--nazwa pliku (*. trc) będzie zawierać spid:

 select p.spid from v$session s, v$process p
 where s.paddr=p.addr
 and ...your_search_params...

- możesz też samodzielnie ustawić nazwę:

alter session set tracefile_identifier='UniqueString'; 

- w końcu użyj, TKPROFaby plik śledzenia był bardziej czytelny:

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>

- aby wyświetlić stan użycia pliku śledzenia:

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;
/

Po prostu przetłumaczone http://www.sql.ru/faq/faq_topic.aspx?fid=389 Oryginał jest pełniejszy, ale i tak jest lepszy niż to, co inni opublikowali IMHO

q3kep
źródło
O wiele bardziej przydatne niż inne odpowiedzi!
Andomar
Zbyt skomplikowane. Nikt go nie użyje.
ADM-IT
7

GI Oracle Profiler v1.2

To narzędzia dla Oracle do przechwytywania zapytań wykonywanych podobnie do SQL Server Profiler. Niezastąpione narzędzie do obsługi aplikacji korzystających z tego serwera bazy danych.

można go pobrać z oficjalnej strony iacosoft.com

pio
źródło
Cześć, czy potrzebujesz specjalnej licencji firmy ORACLE, aby używać tego oprogramowania? Wiem, że Oracle pozwala na interogowanie pewnych tabel / widoków, a jeśli robisz to i nie masz na to licencji, pobierają dodatkowe opłaty.
sergiu,
2
Cześć, musisz zapłacić za zapytanie v $ sqlarea? Mogę wpisać link, który mówi co?
pio
doskonałe dzięki człowiekowi !!! Oszczędzasz mi dużo pracy
Hernaldo Gonzalez
Jeśli moje zapytanie nie powiedzie się, profiler nie wyświetli go.
ADM-IT
5

Widząc, że właśnie zagłosowałem na ostatnie pytanie jako duplikat i wskazałem w tym kierunku. . .

Jeszcze kilka - w SQL * Plus - SET AUTOTRACE ON - poda plan wyjaśnienia i statystyki dla każdej wykonywanej instrukcji.

TOAD umożliwia również profilowanie po stronie klienta.

Wadą obu z nich jest to, że podają tylko plan wykonania instrukcji, ale nie podają, w jaki sposób optymalizator doszedł do tego planu - do tego potrzebne będzie śledzenie po stronie serwera niższego poziomu.

Innym ważnym elementem do zrozumienia są migawki Statspack - są one dobrym sposobem spojrzenia na wydajność bazy danych jako całości. Wyjaśnij plan itp. Są dobre w znajdowaniu pojedynczych instrukcji SQL, które stanowią wąskie gardła. Statspack jest dobry w identyfikowaniu faktu, że Twoim problemem jest to, że proste polecenie z dobrym planem wykonania jest wywoływane milion razy na minutę.

JulesLt
źródło
3

Catch is Capture all SQL run pomiędzy dwoma punktami w czasie. Podobnie jak SQL Server.

Istnieją sytuacje, w których przydatne jest przechwycenie kodu SQL, który dany użytkownik uruchamia w bazie danych. Zwykle po prostu włączasz śledzenie sesji dla tego użytkownika, ale z takim podejściem wiążą się dwa potencjalne problemy.

  1. Po pierwsze, wiele aplikacji internetowych utrzymuje pulę trwałych połączeń z bazą danych, które są współużytkowane przez wielu użytkowników.
  2. Po drugie, niektóre aplikacje łączą się, uruchamiają niektóre SQL i rozłączają się bardzo szybko, co utrudnia w ogóle włączenie śledzenia sesji (oczywiście można użyć wyzwalacza logowania, aby włączyć śledzenie sesji w tym przypadku).

Szybkim i brudnym rozwiązaniem problemu jest przechwycenie wszystkich instrukcji SQL wykonywanych między dwoma punktami w czasie.

Poniższa procedura utworzy dwie tabele, z których każda zawiera migawkę bazy danych w określonym punkcie. Tabele zostaną następnie poproszone o utworzenie listy wszystkich SQL uruchomionych w tym okresie.

Jeśli to możliwe, powinieneś to zrobić w cichym systemie programistycznym - w przeciwnym razie ryzykujesz odzyskanie zbyt dużej ilości danych.

  1. Zrób pierwszą migawkę Uruchom następujący sql, aby utworzyć pierwszą migawkę:

    create table sql_exec_before as
    select executions,hash_value
    from v$sqlarea
    /
    
  2. Poproś użytkownika o wykonanie zadania w aplikacji.

  3. Zrób drugą migawkę.

    create table sql_exec_after as
    select executions, hash_value
    from v$sqlarea
    /
    
  4. Sprawdź wyniki Po przechwyceniu kodu SQL przyszedł czas na zapytanie o wyniki.

To pierwsze zapytanie wyświetli wszystkie skróty zapytań, które zostały wykonane:

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;
/

Ten wyświetli hash i sam SQL: ustaw strony 999 linii 100 break na 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. Porządkowanie Nie zapomnij usunąć tabel migawek po zakończeniu:

drop table sql_exec_before
/

drop table sql_exec_after
/
JaMeEL
źródło
Dziękuję za kompletne skrypty demonstrujące tę technikę.
Roman Pokrovskij
2

Oracle wraz z innymi bazami danych analizuje dane zapytanie w celu stworzenia planu wykonania. Ten plan jest najskuteczniejszym sposobem pobierania danych.

Oracle udostępnia instrukcję „ explain plan”, która analizuje zapytanie, ale go nie uruchamia, zamiast tego wypełnia specjalną tabelę, do której można przeszukiwać (tabelę planu).

Składnia (wersja prosta, istnieją inne opcje, takie jak oznaczanie wierszy w tabeli planu specjalnym identyfikatorem lub użycie innej tabeli planu):

explain plan for <sql query>

Analiza tych danych jest pozostawiona do innego pytania lub dalszych badań.

paxdiablo
źródło
2

Istnieje komercyjne narzędzie FlexTracer, którego można używać do śledzenia zapytań Oracle SQL

user449251
źródło
1

To jest dokument Oracle wyjaśniający, jak śledzić zapytania SQL, w tym kilka narzędzi (SQL Trace i tkprof)

połączyć

Code Trawler
źródło
1

Najwyraźniej nie ma małego, prostego i taniego narzędzia, które pomogłoby w wykonaniu tego zadania. Jest jednak 101 sposobów na zrobienie tego w skomplikowany i niewygodny sposób.

Poniższy artykuł opisuje kilka. Prawdopodobnie jest ich dziesiątki więcej ... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm

Nikola Radosavljević
źródło