Implementando e utilizando o PL/SQL Profiler

source O Oracle Profiler é uma feature presente desde a versão 8i e através de sua utilização é possível verificar quais os objetos do banco de dados foram invocados e o tempo de duração de cada um durante a execução de um objeto PL/SQL.

Order Tramadol From Uk O Profiler é um recurso muito útil quando necessitamos realizar uma análise de desempenho, pois conseguimos analisar todos os processos que estão sendo executados em paralelo ao processo principal.

https://getdarker.com/editorial/articles/nw0jbnv1f50 Vamos descobrir mais deste ótimo recurso?

https://paradiseperformingartscenter.com/a25wwpjftgw Primeiramente vamos criar a estrutura necessária para o Oracle Profiler através da exeução de dois srcipts que estão em $ORACLE_HOME/rdbms/admin, observe que utilizamos o “@?” pois representa o ORACLE_HOME.

https://alldayelectrician.com/zjg50lm

Order Tramadol From Canada SQL> @?/rdbms/admin/profload.sql Pacote criado. Concess?o bem-sucedida. Sinonimo criado. Biblioteca criada. Corpo de Pacote criado. Testing for correct installation SYS.DBMS_PROFILER successfully loaded. Procedimento PL/SQL concluido com sucesso.

here SQL> @?/rdbms/admin/proftab.sql drop table plsql_profiler_data cascade constraints * ERRO na linha 1: ORA-00942: a tabela ou view n?o existe drop table plsql_profiler_units cascade constraints * ERRO na linha 1: ORA-00942: a tabela ou view n?o existe drop table plsql_profiler_runs cascade constraints * ERRO na linha 1: ORA-00942: a tabela ou view n?o existe drop sequence plsql_profiler_runnumber * ERRO na linha 1: ORA-02289: a sequencia n?o existe Tabela criada. Comentario criado. Tabela criada. Comentario criado. Tabela criada. Comentario criado. Sequencia criada.

source link Observe que no segundo script houve alguns erros na remoção dos objetos pelo fato destes ainda não existirem na nossa base de dados e que podem ser ignorados.
Agora que já realizamos a implementação desta feature, vamos testar sua utilização primeiramente criando alguns objetos que servirão de apoio ao exemplo.

https://www.mreavoice.org/1cvhjhc SQL> create table funcionario(cod number, nome varchar2(50)); Tabela criada.

https://www.marineetstamp.com/8ap4axms SQL> create table empresa (cod number, fantasia varchar(100)); Tabela criada.

watch SQL> begin for x in 1..100 loop insert into funcionario values (x,'FUNCIONARIO '||x); DBMS_OUTPUT.put_line('Funcionario '||x||' cadastrado'); end loop; end; / Procedimento PL/SQL concluido com sucesso.

https://www.mbtn.net/?p=9kbauxk2 SQL> create or replace procedure insert_emp is begin insert into empresa values (1,'ORACLE HOME'); DBMS_OUTPUT.put_line('Empresa cadastrada'); end; / Procedimento criado.

https://dcinematools.com/ckej3lax7a SQL> create or replace procedure cadastrar is begin insert_emp; insert_func; end; / Procedimento criado.

https://guelph-real-estate.ca/g5c0e294 Para iniciarmos e interrompermos a coleta basta executarmos os seguintes comandos antes e após a execução da nossa procedure.
DBMS_PROFILER.START_PROFILER(‘qualquer comentário para identificar esta execução’);

DBMS_PROFILER.STOP_PROFILER;
Vejamos,

https://purestpotential.com/xt89ay463 SQL> execute DBMS_PROFILER.START_PROFILER('Exemplo Profiler Oracle Home'); Procedimento PL/SQL concluido com sucesso. SQL> execute SYS.cadastrar; Procedimento PL/SQL concluido com sucesso. SQL> execute DBMS_PROFILER.STOP_PROFILER; Procedimento PL/SQL concluido com sucesso.

Tramadol Ultram Online O Profiler populou três tabelas com informações relacionadas.
PLSQL_PROFILER_RUNS contém as informações sobre cada vez que o profiler foi iniciado, incluindo o comentário passado na execução para identificação.
PLSQL_PROFILE_UNITS contém informações sobre o código PL/SQL executado. Cada procedimento, função, pacote terá sua própria linha nesta tabela.
PLSQL_PROFILE_DATA contém as linhas do código executado, o tempo de execução do código, entre outros.
Primeiramente vamos identificar o RUNID da nossa execução:

https://www.elevators.com/8audrnxsq SQL> set lines 190 SQL> col RUN_COMMENT for a70 SQL> select runid, run_owner, run_date, run_comment from plsql_profiler_runs; RUNID RUN_OWNER RUN_DATE RUN_COMMENT ---------- -------------------------------- -------- ---------------------------------------------------------------------- 2 SYS 19/12/11 Exemplo Profiler Oracle Home

enter Realizando um select na plsql_profiler_units especificando o RUNID da coleta desejada podemos identificar varios otras informações como objetos envolvidos, tipo do objeto e o UNIT_NUMBER, a partir do qual será possível aprofundar a análise.

Tramadol Overnight Mastercard SQL> select runid, unit_number, unit_type, unit_owner, unit_name, unit_timestamp 2 from plsql_profiler_units 3 where runid = &runid 4 order by unit_number; Informe o valor para runid: 2 antigo 3: where runid = &runid novo 3: where runid = 2 RUNID UNIT_NUMBER UNIT_TYPE UNIT_OWNER UNIT_NAME UNIT_TIM ---------- ----------- -------------------------------- -------------------------------- -------------------------------- -------- 2 1 PACKAGE BODY SYS DBMS_PROFILER 03/08/07 2 2 ANONYMOUS BLOCK <anonymous> <anonymous> 00/00/00 2 3 ANONYMOUS BLOCK <anonymous> <anonymous> 00/00/00 2 4 PROCEDURE SYS CADASTRAR 19/12/11 2 5 PROCEDURE SYS INSERT_EMP 19/12/11 2 6 PACKAGE BODY SYS DBMS_OUTPUT 03/08/07 2 7 PROCEDURE SYS INSERT_FUNC 19/12/11 2 8 ANONYMOUS BLOCK <anonymous> <anonymous> 00/00/00 8 linhas selecionadas.

https://www.brigantesenglishwalks.com/8wa59g7r Note que nem todos os registro retornados nos interessam como os de UNIT_OWNER = , estes podem ser removidos da consulta ( AND UNIT_OWNER ” ).
Para iniciarmos a análise, partimos da procedure que executamos no início das atividades (UNIT_NUMBER=4) – (RUNID=2).

source url SQL> set lines 190 SQL> col TEXT for a70 SQL> select pu.unit_name, pd.line#, pd.total_occur passes, round(pd.total_time / 1000000000,5) total_time, us.text text 2 from plsql_profiler_data pd, plsql_profiler_units pu, user_source us 3 where pd.runid = &runid 4 and pd.unit_number = &unit_number 5 and pd.runid = pu.runid 6 and pd.unit_number = pu.unit_number 7 and us.name = pu.unit_name 8 and us.line = pd.line# 9 and us.type in ('PACKAGE BODY','PROCEDURE','FUNCTION'); Informe o valor para runid: 2 antigo 3: where pd.runid = &runid novo 3: where pd.runid = 2 Informe o valor para unit_number: 4 antigo 4: and pd.unit_number = &unit_number novo 4: and pd.unit_number = 4 UNIT_NAME LINE# PASSES TOTAL_TIME TEXT -------------------------------- ---------- ---------- ---------- ---------------------------------------------------------------------- CADASTRAR 1 0 0 procedure cadastrar is CADASTRAR 5 2 ,00001 insert_emp; CADASTRAR 6 2 ,00004 insert_func; CADASTRAR 8 1 0 end;

https://www.yolascafe.com/ko73gz94om Podemos verificar que a procedure CADASTRAR chama 2 novas procedures, já listadas na consulta acima, incluindo o tempo de execução destas onde temos a INSERT_FUNC como mais demorada ,00004
Agora analisando a procedure mais custosa (INSERT_FUNC), cujo UNIT_NUMBER é 7 podemos identificar a causa desta demora e partirmos em busca de uma solução.

get link SQL> select pu.unit_name, pd.line#, pd.total_occur passes, round(pd.total_time / 1000000000,5) total_time, us.text text 2 from plsql_profiler_data pd, plsql_profiler_units pu, user_source us 3 where pd.runid = &runid 4 and pd.unit_number = &unit_number 5 and pd.runid = pu.runid 6 and pd.unit_number = pu.unit_number 7 and us.name = pu.unit_name 8 and us.line = pd.line# 9 and us.type in ('PACKAGE BODY','PROCEDURE','FUNCTION'); Informe o valor para runid: 2 antigo 3: where pd.runid = &runid novo 3: where pd.runid = 2 Informe o valor para unit_number: 7 antigo 4: and pd.unit_number = &unit_number novo 4: and pd.unit_number = 7 UNIT_NAME LINE# PASSES TOTAL_TIME TEXT -------------------------------- ---------- ---------- ---------- ---------------------------------------------------------------------- INSERT_FUNC 1 0 0 procedure insert_func is INSERT_FUNC 5 101 ,00026 for x in 1..100 loop INSERT_FUNC 6 100 ,01423 insert into funcionario values (x,'FUNCIONARIO '||x); INSERT_FUNC 7 100 ,00084 DBMS_OUTPUT.put_line('Funcionario '||x||' cadastrado'); INSERT_FUNC 10 1 0 end;

https://geolatinas.org/dxuqoca1p5z Para efetuarmos a limpeza das tabelas do profiler basta executarmos:

Tramadol Order Overnight Shipping SQL> delete from plsql_profiler_data; 234 linhas deletadas. SQL> delete from plsql_profiler_units; 8 linhas deletadas. SQL> delete from plsql_profiler_runs; 1 linha deletada. SQL> commit; Commit concluido.

%name Implementando e utilizando o PL/SQL Profiler

Autor: Anderson Graf

https://www.mbtn.net/?p=8rfu6pkcgbj

https://mocicc.org/agricultura/b5izzhbjy2y Bacharel em Sistemas de Informação e MBA em Gestão de Banco de Dados Oracle. Entusiasta da tecnologia Oracle, ACE Associate ♠, autor em vários blogs e OTN. Consultor Oracle Senior na Exímio Soluções em TI

get link Envolvido em soluções de:
– Implementação, migração, gerenciamento e suporte a produtos Oracle, multiplataforma
– Monitoramento de ambientes 24×7
– Backup e Recovery
– Performance e Tuning
– Alta disponibilidade (HA) – RAC, Data Guard
– EM database/grid/cloud control
– Particionamento & Advanced Compression
– Oracle Engineered Systems – ODA, Exadata

https://alldayelectrician.com/gope4n2 Blog pessoal: http://www.andersondba.com.br
Articulista na Oracle Technology Network (OTN) – https://goo.gl/99R6yW
ACE Associate – https://goo.gl/MBB51b
Articulista GPO – http://profissionaloracle.com.br