[oracle_br] Re: Trigger utilizando exception

2012-09-18 Por tôpico J. Laurindo Chiappa
  Miltão, ele não diz mas SUPONDO que a tal tabela EMPLOYEE é a mesma usada 
para demonstrações a info sobre o salário do Gerente está em outro registro 
dessa MESMA tabela, então vai dar MUTATING se ele tentar fazer isso num 
trigger, okdoc ?

  Colega, antes de responder a sua pergunta sobre PL/SQL, fique Registrado que 
triggers muitas vezes *** Não São *** a melhor maneira de se fazer integridade 
de dados num ambiente Produção, pois :
  
  a) podem ser bypassadas por algumas tools de carga, e/ou em algumas situações 
impedir o funcionamento adequado de algumas tools (que tentem fazer direct 
path, por exemplo)
  
  b) podem interferir (às vezes seriamente) com a performance, já que (entre 
outras coisas) disparam uma vez a cada INSERT (imagine o overhead num ambiente 
com milhares de INSERTs ocorrendo) , não são parte do kernel do banco (são um 
elemento Externo, não escrito em C e sem possibilidade de usar ganchos e 
sub-rotinas internas do TRDBMS
  
  c) demandam Manutenção - natural, já que são construtos escritos por vc
  
  d) podem ter Diversos efeitos colaterais não previstos, vide 
http://www.oracle.com/technetwork/issue-archive/2008/08-sep/o58asktom-101055.html
 
  
 ==>> então Recursos nativos do database - como índices de função, constraints 
(seja em view materializadas seja em tabelas reais mesmo) e relacionados -  
deveriam ser considerados em primeiro lugar, okdoc ?  Isso MESMO que alterações 
de modelagem sejam necessárias, tipo se adicionar no registro da tabela de 
empregados uma coluna oculta MGR_SAL que contém o salário do Gerente desse 
empregado, ter uma view materializada que "replica" a informação do salário do 
gerente para cada empregado, ou qquer coisa do tipo ... No caso específico de 
integridade de dados entre linhas diferentes da tabela (o que é o seu caso, 
aqui) Tem Autores que até defendem um outro approach : simplesmente REMOVER a 
permissão de INSERT nessa tabela e/ou UPDATE nessa coluna SALARIO e dar pra 
todos os interessados permissão de EXECUTE numa procedure ou função que vc 
escreveu e que faz todas as checagens antes de alterar o dado na tabela  É 
outro ponto a considerar - não deixe de ler sobre essas possibilidades em  
http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:698031000346429496
 , 
http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:636506144470 
e 
http://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:4233459000346171405
 
  
   Vou responder as suas perguntas em um senso acadêmico, pra vc aprender, mas 
fique Ciente das questões acima quando vc for programar/usar um RDBMS Oracle  
"de verdade", right ?

Isso dito, as suas Respostas:  

1. como creio que vc já sabe, para proteção / integridade de dados o 
RDBMS não permite que vc faça nem SELECTs na tabela quando há alterações 
pendentes (o que é o caso da trigger BEFORE), sob pena de erro MUTATING TABLE - 
não há como fazer isso na sua lógica, que usa justamente uma trigger BEFORE 
INSERT na tabela employees e o registro do gerente a obter o salário Também 
está na employeesVc não diz mas Entendo que é esse o seu problema/dúvida 
aqui...

Assim, para contornar isso SEM usar as opções melhores que citei lá no 
começo, vc poderia :

- usar uma transação Autônoma que busque a info 

e/ou

- ter uma trigger AFTER, que dispara  após a inserção/alteração

e/ou 

- SE a sua versão é 11g (o que vc não diz mas deveria, é SEMPRE 
aconselhável citar a versão) vc poderia talvez usar copound triggers, veja 
http://mikesmithers.wordpress.com/2010/04/24/compound-triggers-%E2%80%93-managing-the-mutant-menace/
 

2. sobe a Exception, não : vc Não Pode usar uma Exception para 
"mostrar" nada em princípio : o que uma EXCEPTION faz é desviar o fluxo do seu 
programa quando há um erro, mas por si só ela NÃO implica em "mensagem" alguma, 
nem em Abort do fluxo PL/SQL, nem em "aviso" algum, ok ? Vc até poderia na área 
de EXCEPTION usar um comando apropriado (e inclusive Se vc quer que o cliente 
que dez o SQL receba um warning E também que o SQL seja abortado/sinalizado com 
erro, RAISE_APPLICATION_ERROR é a opção), mas não é de forma alguma Obrigatório 
o EXCEPTION

[]s

   Chiappa
   

--- Em oracle_br@yahoogrupos.com.br, "Milton Bastos Henriquis Jr." 
 escreveu
>
> Boa tarde!
> 
> Suas perguntas já estão todas respondidas por você mesmo... rs
> Está tudo correto o que vc falou.
> 
> Faça um SELECT INTO para pegar o valor do salário do gerente
> do sujeito e armazenar numa variável.
> Depois compare o valor do salário do sujeito com a variável...
> Se for maior, vc dispara a exceção.
> 
> 
> 
> 
> 2012/9/18 Antony Ferreira 
> 
> > **
> >
> >
> > Boa tarde pessoal,
> >
> > Estou começando a estudar um pouco de PL/SQL e me surgiu umas duvidas.
> > Tenho a seguinte trigger:
> >

Re: [oracle_br] Trigger utilizando exception

2012-09-18 Por tôpico Antony Ferreira
Blz, vou fazer as alterações e testar aqui pra ver como que vai funcionar.
Vlw mto obrigado pelas dicas.

Em 18 de setembro de 2012 18:07, Milton Bastos Henriquis Jr. <
miltonbas...@gmail.com> escreveu:

> Bom, lógica de programação é algo muito simples!
> Vc tem que saber o que exatamente vc quer que o teu código faça...
>
> Vc criou ali um IF (não sei se foi vc que fez ou se vc copiou o código)
> pra testar se o cara é "presidente" ou "vp", pois se for, daí vc não
> testa o salário do cara... então não faz sentido vc fazer o select FORA
> do primeiro if, senão vc poderá estar executando um select a toa.
> Então é melhor vc executar dentro do primeiro IF.
>
>
>
>
> 2012/9/18 Antony Ferreira 
>
> > **
> >
> >
> > A select eu teria que fazer dentro do primeiro IF ou antes do IF, como
> > estou começando a pegar os esquemas do PLSQL agora, tem coisas que eu
> fico
> > na duvida um pouco.
> >
> > Em 18 de setembro de 2012 17:52, Milton Bastos Henriquis Jr. <
> > miltonbas...@gmail.com> escreveu:
> >
> >
> > > Boa tarde!
> > >
> > > Suas perguntas já estão todas respondidas por você mesmo... rs
> > > Está tudo correto o que vc falou.
> > >
> > > Faça um SELECT INTO para pegar o valor do salário do gerente
> > > do sujeito e armazenar numa variável.
> > > Depois compare o valor do salário do sujeito com a variável...
> > > Se for maior, vc dispara a exceção.
> > >
> > >
> > >
> > >
> > > 2012/9/18 Antony Ferreira 
> > >
> > > > **
> >
> > > >
> > > >
> > > > Boa tarde pessoal,
> > > >
> > > > Estou começando a estudar um pouco de PL/SQL e me surgiu umas
> duvidas.
> > > > Tenho a seguinte trigger:
> > > >
> > > > CREATE OR REPLACE TRIGGER imp_novos_emp
> > > > BEFORE INSERT OR UPDATE ON employees
> > > > FOR EACH ROW
> > > > BEGIN
> > > > IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP')) THEN
> > > > IF :NEW.salary > 15000 THEN
> > > > RAISE_APPLICATION_ERROR (-20202,'Este empregado não pode receber este
> > > > valor');
> > > > END IF;
> > > > END IF;
> > > > END imp_novos_emp;
> > > > /
> > > >
> > > > Qual seria a melhor maneira para eu poder impedir que seja inserido
> um
> > > novo
> > > > empregado que tenha o salario maior que o gerente.
> > > >
> > > > Eu teria que fazer uma consulta na coluna manager_id da tabela
> > employees
> > > e
> > > > verificar se o salario do empregado que eu estou add é maior que o do
> > > > gerente?
> > > > Outra duvida, posso colocar uma excessão para mostrar que o salario é
> > > > invalido quando o salario do empregado que eu estou add é maior que o
> > do
> > > > gerente?
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > > --
> > > Att,
> >
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> > > 
> >
> > >
> > >
> > > --
> > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> > > inteira responsabilidade de seus remetentes.
> > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> > >
> > > --
> > > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> > > Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO
> > ESPAÇO!
> > > VISITE: http://www.oraclebr.com.br/
> > > --
> > > Links do Yahoo! Grupos
> >
> > >
> > >
> > >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
>
>
>
> --
> Att,
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> 
>
>
> --
> >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> inteira responsabilidade de seus remetentes.
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
>
> --
> >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO!
> VISITE: http://www.oraclebr.com.br/
> 
> Links do Yahoo! Grupos
>
>
>


[As partes desta mensagem que não continham texto foram removidas]



Re: [oracle_br] Trigger utilizando exception

2012-09-18 Por tôpico Milton Bastos Henriquis Jr.
Bom, lógica de programação é algo muito simples!
Vc tem que saber o que exatamente vc quer que o teu código faça...

Vc criou ali um IF (não sei se foi vc que fez ou se vc copiou o código)
pra testar se o cara é "presidente" ou "vp", pois se for, daí vc não
testa o salário do cara... então não faz sentido vc fazer o select FORA
do primeiro if, senão vc poderá estar executando um select a toa.
Então é melhor vc executar dentro do primeiro IF.




2012/9/18 Antony Ferreira 

> **
>
>
> A select eu teria que fazer dentro do primeiro IF ou antes do IF, como
> estou começando a pegar os esquemas do PLSQL agora, tem coisas que eu fico
> na duvida um pouco.
>
> Em 18 de setembro de 2012 17:52, Milton Bastos Henriquis Jr. <
> miltonbas...@gmail.com> escreveu:
>
>
> > Boa tarde!
> >
> > Suas perguntas já estão todas respondidas por você mesmo... rs
> > Está tudo correto o que vc falou.
> >
> > Faça um SELECT INTO para pegar o valor do salário do gerente
> > do sujeito e armazenar numa variável.
> > Depois compare o valor do salário do sujeito com a variável...
> > Se for maior, vc dispara a exceção.
> >
> >
> >
> >
> > 2012/9/18 Antony Ferreira 
> >
> > > **
>
> > >
> > >
> > > Boa tarde pessoal,
> > >
> > > Estou começando a estudar um pouco de PL/SQL e me surgiu umas duvidas.
> > > Tenho a seguinte trigger:
> > >
> > > CREATE OR REPLACE TRIGGER imp_novos_emp
> > > BEFORE INSERT OR UPDATE ON employees
> > > FOR EACH ROW
> > > BEGIN
> > > IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP')) THEN
> > > IF :NEW.salary > 15000 THEN
> > > RAISE_APPLICATION_ERROR (-20202,'Este empregado não pode receber este
> > > valor');
> > > END IF;
> > > END IF;
> > > END imp_novos_emp;
> > > /
> > >
> > > Qual seria a melhor maneira para eu poder impedir que seja inserido um
> > novo
> > > empregado que tenha o salario maior que o gerente.
> > >
> > > Eu teria que fazer uma consulta na coluna manager_id da tabela
> employees
> > e
> > > verificar se o salario do empregado que eu estou add é maior que o do
> > > gerente?
> > > Outra duvida, posso colocar uma excessão para mostrar que o salario é
> > > invalido quando o salario do empregado que eu estou add é maior que o
> do
> > > gerente?
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> >
> >
> >
> > --
> > Att,
>
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
> > 
>
> >
> >
> > --
> > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> > inteira responsabilidade de seus remetentes.
> > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> >
> > --
> > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> > Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO
> ESPAÇO!
> > VISITE: http://www.oraclebr.com.br/
> > --
> > Links do Yahoo! Grupos
>
> >
> >
> >
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Att,


[As partes desta mensagem que não continham texto foram removidas]





--
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  

 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html




Re: [oracle_br] Trigger utilizando exception

2012-09-18 Por tôpico Antony Ferreira
A select eu teria que fazer dentro do primeiro IF ou antes do IF, como
estou começando a pegar os esquemas do PLSQL agora, tem coisas que eu fico
na duvida um pouco.


Em 18 de setembro de 2012 17:52, Milton Bastos Henriquis Jr. <
miltonbas...@gmail.com> escreveu:

> Boa tarde!
>
> Suas perguntas já estão todas respondidas por você mesmo... rs
> Está tudo correto o que vc falou.
>
> Faça um SELECT INTO para pegar o valor do salário do gerente
> do sujeito e armazenar numa variável.
> Depois compare o valor do salário do sujeito com a variável...
> Se for maior, vc dispara a exceção.
>
>
>
>
> 2012/9/18 Antony Ferreira 
>
> > **
> >
> >
> > Boa tarde pessoal,
> >
> > Estou começando a estudar um pouco de PL/SQL e me surgiu umas duvidas.
> > Tenho a seguinte trigger:
> >
> > CREATE OR REPLACE TRIGGER imp_novos_emp
> > BEFORE INSERT OR UPDATE ON employees
> > FOR EACH ROW
> > BEGIN
> > IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP')) THEN
> > IF :NEW.salary > 15000 THEN
> > RAISE_APPLICATION_ERROR (-20202,'Este empregado não pode receber este
> > valor');
> > END IF;
> > END IF;
> > END imp_novos_emp;
> > /
> >
> > Qual seria a melhor maneira para eu poder impedir que seja inserido um
> novo
> > empregado que tenha o salario maior que o gerente.
> >
> > Eu teria que fazer uma consulta na coluna manager_id da tabela employees
> e
> > verificar se o salario do empregado que eu estou add é maior que o do
> > gerente?
> > Outra duvida, posso colocar uma excessão para mostrar que o salario é
> > invalido quando o salario do empregado que eu estou add é maior que o do
> > gerente?
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
>
>
>
> --
> Att,
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> 
>
>
> --
> >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> inteira responsabilidade de seus remetentes.
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
>
> --
> >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO!
> VISITE: http://www.oraclebr.com.br/
> 
> Links do Yahoo! Grupos
>
>
>


[As partes desta mensagem que não continham texto foram removidas]



Re: [oracle_br] Trigger utilizando exception

2012-09-18 Por tôpico Milton Bastos Henriquis Jr.
Boa tarde!

Suas perguntas já estão todas respondidas por você mesmo... rs
Está tudo correto o que vc falou.

Faça um SELECT INTO para pegar o valor do salário do gerente
do sujeito e armazenar numa variável.
Depois compare o valor do salário do sujeito com a variável...
Se for maior, vc dispara a exceção.




2012/9/18 Antony Ferreira 

> **
>
>
> Boa tarde pessoal,
>
> Estou começando a estudar um pouco de PL/SQL e me surgiu umas duvidas.
> Tenho a seguinte trigger:
>
> CREATE OR REPLACE TRIGGER imp_novos_emp
> BEFORE INSERT OR UPDATE ON employees
> FOR EACH ROW
> BEGIN
> IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP')) THEN
> IF :NEW.salary > 15000 THEN
> RAISE_APPLICATION_ERROR (-20202,'Este empregado não pode receber este
> valor');
> END IF;
> END IF;
> END imp_novos_emp;
> /
>
> Qual seria a melhor maneira para eu poder impedir que seja inserido um novo
> empregado que tenha o salario maior que o gerente.
>
> Eu teria que fazer uma consulta na coluna manager_id da tabela employees e
> verificar se o salario do empregado que eu estou add é maior que o do
> gerente?
> Outra duvida, posso colocar uma excessão para mostrar que o salario é
> invalido quando o salario do empregado que eu estou add é maior que o do
> gerente?
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Att,


[As partes desta mensagem que não continham texto foram removidas]





--
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  

 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html




[oracle_br] Re: Tabelas Particionadas - Table Partition

2012-09-18 Por tôpico J. Laurindo Chiappa
  Uma dica : ** releia ** a minha msg, onde eu digo que além do tamanho E do 
fato de ser bastante usada, ela TEM que estar sendo usada da maneira adequada 
para se pensar em particionamento , ie : ela deve estar sendo usada para SCAN 
basicamente (e não para index lookup/key search), a chave de particionamento 
TEM que estar sendo referenciada na ESMAGADORA maioria das consultas , okdoc 
??? 

 []s

   Chiappa

--- Em oracle_br@yahoogrupos.com.br, Wanderson Barrence  escreveu
>
> Olá Pessoal,
> 
> Vocês já ajudaram bastante!!!
> 
> A tabela da minha base dados que eu estou querendo particionar tem 10,15 GB
> e mais 81.000 Linhas, e ainda tem uma coluna BLOB!!!
> 
> Geralmente essa tabela é bastante usada pelo sistema.
> 
> Att,
> 
> --
> Wanderson Barrence
> DBA Oracle 10g/11g
> Analista de Testes - CBTS
> --
> MSN: wbarrence@...
> ICQ: 170821994
> Linkedin: http://br.linkedin.com/in/wbarrence
> 
> 
> 
> Em 18 de setembro de 2012 10:58, Milton Bastos Henriquis Jr. <
> miltonbastos@...> escreveu:
> 
> > Wanderson, acho que vc deveria estudar todo o conceito de particionamento
> > de tabelas, entender as vantagens que o particionamento pode te trazer, pra
> > daí
> > então vc (que conhece o seu ambiente, que conhece a SUA base de dados)
> > ver quais as tabelas que são mais indicadas.
> >
> > Aqui numa lista de e-mail fica fácil a gente responder dúvidas pontuais, ou
> > seja,
> > "detalhes". Mas ficar ensinando todo um conceito de uma Option não é nada
> > rápido.
> >
> > Tem diversas situações diferentes, diversos cenários onde se é vantajoso
> > aplicar
> > o particionamento. As condições não se restrigem ao que vc citou abaixo
> > (tamanho
> > da tabela, quantidade de linhas, etc...). Depende do seu cenário.
> >
> > Um cenário clássico são tabelas que tenham crescimento muito alto
> > (milhões de registros por mês sendo inseridos) E que além disso os SELECTs
> > mais
> > frequentes sejam nos dados mais RECENTES (mês corrente, por exemplo).
> > É o caso onde os dados dos meses anteriores acabam virando apenas um
> > histórico,
> > ou seja, quase nunca são acessados. Daí cabe muito bem um particionamento
> > pelo campo DATA, usando o MÊS.
> >
> > Portanto não adianta apenas falar: "ah, veja as tabelas que tem mais
> > linhas!"
> > Vc precisa aprender o CONCEITO do particionamento pra daí vc saber se é
> > aplicável
> > no SEU ambiente, no seu cenário.
> >
> > Demonstrei apenas um caso acima e meu e-mail já ficou enorme... se fosse
> > mostrar todas possibilidades eu ficaria dias aqui escrevendo, por isso eu
> > disse no começo,
> > é importante primeiro aprender todo o conceito.
> >
> >
> >
> >
> > 2012/9/18 Wanderson Barrence 
> >
> > > **
> > >
> > >
> > > Olá Pessoal,
> > >
> > > Alguém sabe como eu faço para definir as tabelas que são candidatas a
> > serem
> > > particionadas?
> > > Essas tabelas são definidas por quantidade de linhas, tamanho em MB ou
> > > quantidade de acesso?
> > >
> > > Att,
> > > --
> > > Wanderson Barrence
> > > DBA Oracle 10g/11g
> > > Analista de Testes - CBTS
> > > --
> > > MSN: wbarrence@...
> > > ICQ: 170821994
> > > Linkedin: http://br.linkedin.com/in/wbarrence
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> >
> >
> >
> > --
> > Att,
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
> > 
> >
> >
> > --
> > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> > inteira responsabilidade de seus remetentes.
> > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> >
> > --
> > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> > Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO!
> > VISITE: http://www.oraclebr.com.br/
> > 
> > Links do Yahoo! Grupos
> >
> >
> >
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




[oracle_br] Ajuda - Desempenho em consulta

2012-09-18 Por tôpico Samuel Santos
Olá Pessoal.
>
>
>
>Estou passando por um problema sério numa consulta no ambiente de produção, a 
>mesma apresenta lentidão na sua utilização(praticamente todo o sistema a 
>utiliza), como não tenho experiência em Tunning de consulta, estou recorrendo 
>a ajuda de vocês. 
>
>
>Será que poderiam me ajudar a melhorar a consulta de forma que eu consiga ter 
>ganho de desempenho. 
>
>
>Como não tenho muita experiência em SQL, talvez com ajuda de vocês, seja 
>possível reescrever um SQL que foi mal escrito pelo desenvolvedor ou até mesmo 
>sugerir a criação índice.
>
>
>
>
>Obs.: o script foi criado para T-SQL mas pelo que pude analisar, o que impacta 
>mesmo são as condições utilizadas como clausulas UNION, DISTINCT. Precisaria 
>mesmo de uma apoio para reescrever a consulta utilizando melhor a linguagem 
>SQL para optimizar a mesma.
>
>
>
>Toda ajuda é sempre bem vinda.
>Desde já agradeço o apoio de sempre.
  --

CREATE PROCEDURE [dbo].[SP_AV_SELECT_MINHAS_AVALIACOES]
(
 @CPF VARCHAR(14)
)
AS
-- MINHAS AVALIAÇÕES
SELECT COD_AVALIACAO, COD_CR_ASSOCIADO, COD_EMP_ASSOCIADO, DES_NOME_CARGO, 
COD_MODELO, ANO_APLICACAO, COD_STATUS, IDPESSOA, 
   DAT_CRIACAO, USR_CRIACAO, DAT_ULT_ATUALIZACAO, USR_ULT_ATUALIZACAO, 
DAT_LIMITE_PREENCHIMENTO, DAT_CRIACAO_RELATORIO, 
   USR_CRIACAO_RELATORIO, CPF_ASSOCIADO, RELATORIO_GERADO
FROM  DBO.AV_AVALIACAO
WHERE (CPF_ASSOCIADO = @CPF)
-- MINHAS AVALIAÇÕES
UNION
-- AVALIAÇÕES SUBORDINADOS
SELECTDBO.AV_AVALIACAO.COD_AVALIACAO, DBO.AV_AVALIACAO.COD_CR_ASSOCIADO, 
DBO.AV_AVALIACAO.COD_EMP_ASSOCIADO, 
  DBO.AV_AVALIACAO.DES_NOME_CARGO, DBO.AV_AVALIACAO.COD_MODELO, 
DBO.AV_AVALIACAO.ANO_APLICACAO, 
  DBO.AV_AVALIACAO.COD_STATUS, DBO.AV_AVALIACAO.IDPESSOA, 
DBO.AV_AVALIACAO.DAT_CRIACAO, DBO.AV_AVALIACAO.USR_CRIACAO, 
  DBO.AV_AVALIACAO.DAT_ULT_ATUALIZACAO, 
DBO.AV_AVALIACAO.USR_ULT_ATUALIZACAO, 
DBO.AV_AVALIACAO.DAT_LIMITE_PREENCHIMENTO, 
  DBO.AV_AVALIACAO.DAT_CRIACAO_RELATORIO, 
DBO.AV_AVALIACAO.USR_CRIACAO_RELATORIO, DBO.AV_AVALIACAO.CPF_ASSOCIADO, 
DBO.AV_AVALIACAO.RELATORIO_GERADO
FROM  DBO.AV_QUESTIONARIO INNER JOIN
  DBO.AV_AVALIACAO ON DBO.AV_QUESTIONARIO.COD_AVALIACAO = 
DBO.AV_AVALIACAO.COD_AVALIACAO
WHERE DBO.AV_QUESTIONARIO.COD_TIPO_QUESTIONARIO = 2 AND 
  (DBO.AV_QUESTIONARIO.IDPESSOA IN (SELECT DBO.USUARIO_DADOS.IDPESSOA   
 
 FROM  DBO.USUARIO_DADOS
 WHERE CPF = @CPF AND IDPESSOA <> 
''))
-- AVALIAÇÕES SUBORDINADOS
UNION
-- AVALIAÇÕES QUESTIONÁRIOS PENDENTES
SELECTDBO.AV_AVALIACAO.COD_AVALIACAO, DBO.AV_AVALIACAO.COD_CR_ASSOCIADO, 
DBO.AV_AVALIACAO.COD_EMP_ASSOCIADO, 
  DBO.AV_AVALIACAO.DES_NOME_CARGO, 
DBO.AV_AVALIACAO.COD_MODELO, DBO.AV_AVALIACAO.ANO_APLICACAO, 
  DBO.AV_AVALIACAO.COD_STATUS, DBO.AV_AVALIACAO.IDPESSOA, 
DBO.AV_AVALIACAO.DAT_CRIACAO, DBO.AV_AVALIACAO.USR_CRIACAO, 
  DBO.AV_AVALIACAO.DAT_ULT_ATUALIZACAO, 
DBO.AV_AVALIACAO.USR_ULT_ATUALIZACAO, 
DBO.AV_AVALIACAO.DAT_LIMITE_PREENCHIMENTO, 
  DBO.AV_AVALIACAO.DAT_CRIACAO_RELATORIO, 
DBO.AV_AVALIACAO.USR_CRIACAO_RELATORIO, DBO.AV_AVALIACAO.CPF_ASSOCIADO, 
DBO.AV_AVALIACAO.RELATORIO_GERADO
FROM DBO.AV_QUESTIONARIO INNER JOIN
  DBO.AV_AVALIACAO ON DBO.AV_QUESTIONARIO.COD_AVALIACAO = 
DBO.AV_AVALIACAO.COD_AVALIACAO
WHERE DBO.AV_QUESTIONARIO.STA_QUESTIONARIO = 1
AND (DBO.AV_AVALIACAO.COD_STATUS = 1)
AND (DBO.AV_QUESTIONARIO.IDPESSOA IN (SELECT DBO.USUARIO_DADOS.IDPESSOA 
   
FROM  DBO.USUARIO_DADOS
WHERE  CPF = @CPF AND IDPESSOA <> ''))
-- AVALIAÇÕES QUESTIONÁRIOS PENDENTES
UNION
-- AVALIAÇÕES COM STATUS “DEVOLUTIVA” E SUPERIOR ATUAL DIFERENTE 
SELECT DISTINCT A.COD_AVALIACAO, A.COD_CR_ASSOCIADO, A.COD_EMP_ASSOCIADO, 
   A.DES_NOME_CARGO, A.COD_MODELO, A.ANO_APLICACAO, 
   A.COD_STATUS, A.IDPESSOA, A.DAT_CRIACAO, A.USR_CRIACAO, 
   A.DAT_ULT_ATUALIZACAO, A.USR_ULT_ATUALIZACAO, 
A.DAT_LIMITE_PREENCHIMENTO, 
   A.DAT_CRIACAO_RELATORIO, A.USR_CRIACAO_RELATORIO, A.CPF_ASSOCIADO, 
A.RELATORIO_GERADO
FROM   DBO.AV_QUESTIONARIO Q, DBO.AV_AVALIACAO A, DBO.USUARIO_DADOS U
WHERE Q.COD_TIPO_QUESTIONARIO = 2 AND 
  Q.STA_QUESTIONARIO = 2 AND 
  Q.COD_AVALIACAO = A.COD_AVALIACAO AND
  A.COD_STATUS = 3 AND 
  U.CPF = A.CPF_ASSOCIADO AND
  U.DATA_DEMISSAO IS NULL AND 
  (U.IDPESSOA_SUPERIORIMEDIATO IN (SELECT UD.IDPESSOA
   FROM  DBO.USUARIO_DADOS UD
   WHERE UD.C

Re: [oracle_br] Tabelas Particionadas - Table Partition

2012-09-18 Por tôpico Milton Bastos Henriquis Jr.
Sua tabela parece ser "grande" (em GB) graças ao BLOB.

Ela é muito pequena em número de linhas. Menos de 100 mil linhas!

Sinceramente não sei se é o caso, mas ACHO que particionamento não vá
ajudar em nada!
O Chiappa pode falar a respeito e me corrigir se eu estiver errado...
sinceramente
eu não sei se vale a pena particioná-la só por causa do tamanho em GB.

Teria que ver se existe algum campo que justifique a "divisão lógica" pra
particionar
essa tabela. Se não existir, ou seja, se os seus Select's ficarem buscando
dados
em TODAS as partições, daí eu não vejo vantagem no particionamento.




2012/9/18 Wanderson Barrence 

> **
>
>
> Olá Pessoal,
>
> Vocês já ajudaram bastante!!!
>
> A tabela da minha base dados que eu estou querendo particionar tem 10,15 GB
> e mais 81.000 Linhas, e ainda tem uma coluna BLOB!!!
>
> Geralmente essa tabela é bastante usada pelo sistema.
>
>
> Att,
>
> --
> Wanderson Barrence
> DBA Oracle 10g/11g
> Analista de Testes - CBTS
> --
> MSN: wbarre...@hotmail.com
> ICQ: 170821994
> Linkedin: http://br.linkedin.com/in/wbarrence
>
> Em 18 de setembro de 2012 10:58, Milton Bastos Henriquis Jr. <
> miltonbas...@gmail.com> escreveu:
>
>
> > Wanderson, acho que vc deveria estudar todo o conceito de particionamento
> > de tabelas, entender as vantagens que o particionamento pode te trazer,
> pra
> > daí
> > então vc (que conhece o seu ambiente, que conhece a SUA base de dados)
> > ver quais as tabelas que são mais indicadas.
> >
> > Aqui numa lista de e-mail fica fácil a gente responder dúvidas pontuais,
> ou
> > seja,
> > "detalhes". Mas ficar ensinando todo um conceito de uma Option não é nada
> > rápido.
> >
> > Tem diversas situações diferentes, diversos cenários onde se é vantajoso
> > aplicar
> > o particionamento. As condições não se restrigem ao que vc citou abaixo
> > (tamanho
> > da tabela, quantidade de linhas, etc...). Depende do seu cenário.
> >
> > Um cenário clássico são tabelas que tenham crescimento muito alto
> > (milhões de registros por mês sendo inseridos) E que além disso os
> SELECTs
> > mais
> > frequentes sejam nos dados mais RECENTES (mês corrente, por exemplo).
> > É o caso onde os dados dos meses anteriores acabam virando apenas um
> > histórico,
> > ou seja, quase nunca são acessados. Daí cabe muito bem um particionamento
> > pelo campo DATA, usando o MÊS.
> >
> > Portanto não adianta apenas falar: "ah, veja as tabelas que tem mais
> > linhas!"
> > Vc precisa aprender o CONCEITO do particionamento pra daí vc saber se é
> > aplicável
> > no SEU ambiente, no seu cenário.
> >
> > Demonstrei apenas um caso acima e meu e-mail já ficou enorme... se fosse
> > mostrar todas possibilidades eu ficaria dias aqui escrevendo, por isso eu
> > disse no começo,
> > é importante primeiro aprender todo o conceito.
> >
> >
> >
> >
> > 2012/9/18 Wanderson Barrence 
> >
> > > **
>
> > >
> > >
> > > Olá Pessoal,
> > >
> > > Alguém sabe como eu faço para definir as tabelas que são candidatas a
> > serem
> > > particionadas?
> > > Essas tabelas são definidas por quantidade de linhas, tamanho em MB ou
> > > quantidade de acesso?
> > >
> > > Att,
> > > --
> > > Wanderson Barrence
> > > DBA Oracle 10g/11g
> > > Analista de Testes - CBTS
> > > --
> > > MSN: wbarre...@hotmail.com
> > > ICQ: 170821994
> > > Linkedin: http://br.linkedin.com/in/wbarrence
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> >
> >
> >
> > --
> > Att,
>
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
> > 
>
> >
> >
> > --
> > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> > inteira responsabilidade de seus remetentes.
> > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> >
> > --
> > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> > Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO
> ESPAÇO!
> > VISITE: http://www.oraclebr.com.br/
> > --
> > Links do Yahoo! Grupos
>
> >
> >
> >
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Att,


[As partes desta mensagem que não continham texto foram removidas]





--
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--
>Apostilas » Dicas e Exemplos » Funç

Re: [oracle_br] Tabelas Particionadas - Table Partition

2012-09-18 Por tôpico Wanderson Barrence
Olá Pessoal,

Vocês já ajudaram bastante!!!

A tabela da minha base dados que eu estou querendo particionar tem 10,15 GB
e mais 81.000 Linhas, e ainda tem uma coluna BLOB!!!

Geralmente essa tabela é bastante usada pelo sistema.

Att,

--
Wanderson Barrence
DBA Oracle 10g/11g
Analista de Testes - CBTS
--
MSN: wbarre...@hotmail.com
ICQ: 170821994
Linkedin: http://br.linkedin.com/in/wbarrence



Em 18 de setembro de 2012 10:58, Milton Bastos Henriquis Jr. <
miltonbas...@gmail.com> escreveu:

> Wanderson, acho que vc deveria estudar todo o conceito de particionamento
> de tabelas, entender as vantagens que o particionamento pode te trazer, pra
> daí
> então vc (que conhece o seu ambiente, que conhece a SUA base de dados)
> ver quais as tabelas que são mais indicadas.
>
> Aqui numa lista de e-mail fica fácil a gente responder dúvidas pontuais, ou
> seja,
> "detalhes". Mas ficar ensinando todo um conceito de uma Option não é nada
> rápido.
>
> Tem diversas situações diferentes, diversos cenários onde se é vantajoso
> aplicar
> o particionamento. As condições não se restrigem ao que vc citou abaixo
> (tamanho
> da tabela, quantidade de linhas, etc...). Depende do seu cenário.
>
> Um cenário clássico são tabelas que tenham crescimento muito alto
> (milhões de registros por mês sendo inseridos) E que além disso os SELECTs
> mais
> frequentes sejam nos dados mais RECENTES (mês corrente, por exemplo).
> É o caso onde os dados dos meses anteriores acabam virando apenas um
> histórico,
> ou seja, quase nunca são acessados. Daí cabe muito bem um particionamento
> pelo campo DATA, usando o MÊS.
>
> Portanto não adianta apenas falar: "ah, veja as tabelas que tem mais
> linhas!"
> Vc precisa aprender o CONCEITO do particionamento pra daí vc saber se é
> aplicável
> no SEU ambiente, no seu cenário.
>
> Demonstrei apenas um caso acima e meu e-mail já ficou enorme... se fosse
> mostrar todas possibilidades eu ficaria dias aqui escrevendo, por isso eu
> disse no começo,
> é importante primeiro aprender todo o conceito.
>
>
>
>
> 2012/9/18 Wanderson Barrence 
>
> > **
> >
> >
> > Olá Pessoal,
> >
> > Alguém sabe como eu faço para definir as tabelas que são candidatas a
> serem
> > particionadas?
> > Essas tabelas são definidas por quantidade de linhas, tamanho em MB ou
> > quantidade de acesso?
> >
> > Att,
> > --
> > Wanderson Barrence
> > DBA Oracle 10g/11g
> > Analista de Testes - CBTS
> > --
> > MSN: wbarre...@hotmail.com
> > ICQ: 170821994
> > Linkedin: http://br.linkedin.com/in/wbarrence
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
>
>
>
> --
> Att,
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> 
>
>
> --
> >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> inteira responsabilidade de seus remetentes.
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
>
> --
> >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO!
> VISITE: http://www.oraclebr.com.br/
> 
> Links do Yahoo! Grupos
>
>
>


[As partes desta mensagem que não continham texto foram removidas]



Re: [oracle_br] Tabelas Particionadas - Table Partition

2012-09-18 Por tôpico Milton Bastos Henriquis Jr.
Wanderson, acho que vc deveria estudar todo o conceito de particionamento
de tabelas, entender as vantagens que o particionamento pode te trazer, pra
daí
então vc (que conhece o seu ambiente, que conhece a SUA base de dados)
ver quais as tabelas que são mais indicadas.

Aqui numa lista de e-mail fica fácil a gente responder dúvidas pontuais, ou
seja,
"detalhes". Mas ficar ensinando todo um conceito de uma Option não é nada
rápido.

Tem diversas situações diferentes, diversos cenários onde se é vantajoso
aplicar
o particionamento. As condições não se restrigem ao que vc citou abaixo
(tamanho
da tabela, quantidade de linhas, etc...). Depende do seu cenário.

Um cenário clássico são tabelas que tenham crescimento muito alto
(milhões de registros por mês sendo inseridos) E que além disso os SELECTs
mais
frequentes sejam nos dados mais RECENTES (mês corrente, por exemplo).
É o caso onde os dados dos meses anteriores acabam virando apenas um
histórico,
ou seja, quase nunca são acessados. Daí cabe muito bem um particionamento
pelo campo DATA, usando o MÊS.

Portanto não adianta apenas falar: "ah, veja as tabelas que tem mais
linhas!"
Vc precisa aprender o CONCEITO do particionamento pra daí vc saber se é
aplicável
no SEU ambiente, no seu cenário.

Demonstrei apenas um caso acima e meu e-mail já ficou enorme... se fosse
mostrar todas possibilidades eu ficaria dias aqui escrevendo, por isso eu
disse no começo,
é importante primeiro aprender todo o conceito.




2012/9/18 Wanderson Barrence 

> **
>
>
> Olá Pessoal,
>
> Alguém sabe como eu faço para definir as tabelas que são candidatas a serem
> particionadas?
> Essas tabelas são definidas por quantidade de linhas, tamanho em MB ou
> quantidade de acesso?
>
> Att,
> --
> Wanderson Barrence
> DBA Oracle 10g/11g
> Analista de Testes - CBTS
> --
> MSN: wbarre...@hotmail.com
> ICQ: 170821994
> Linkedin: http://br.linkedin.com/in/wbarrence
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Att,


[As partes desta mensagem que não continham texto foram removidas]





--
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  

 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html




[oracle_br] Re: Tabelas Particionadas - Table Partition

2012-09-18 Por tôpico J. Laurindo Chiappa
 Não é por ** nenhum ** desses elementos isoladamente - a Recomendação 
principal é vc particionar as tabelas que :
 
  - sejam de um tamanho na casa de dezenas (ou centenas) de Gigabytes e acima - 
não é MB, e sim GB
  
  E QUE
  
  - não sejam acessadas via lookup/ index search (particionamento só faz 
sentido via de regra quando há algum tipode SCAN envolvido, se a busca é por 
chave de índice normalmente não há efeito positivo)
  
  E QUE 

  - tenham um elemento de agrupação de registros lógico bem definido , que na 
Esmagadora maioria dos acesso vai estar presente em quase TODAs as queries dos 
usuários E que consiga "eliminar" muitos registros na filtragem


 => Por exemplo, suponha que haja uma Data de Uso, que haja muitos registros 
espalhados em muitos meses do ano mas quase todas as queries vão se referir a 
um Mês específico, esse seria um caso típico que poderia se beneficiar de 
Particionamento : nesse cenário seria possível acessar só a partição (ou as 
poucas partições, se não for particionamento por mês mas por data) que são 
capazes de conter os registros desejados, pulando as outras e assim 
possibilitando SCANs muito mais eficientes. 
  Óbvio ululante, se essas condições todas não estiverem presentes, é MUITO 
possível que vc piore a performance : imagine que vc particionou por data mas 
NÂO há nas queries uma filtragem por data - o que vai acontecer nesse caso é 
que, ao invés do RDBMS conseguir fazer um único e suculento full table 
scan/index fast full scan pra encontrar os dados (e provavelmente em parallel), 
no caso de partição com chave não-referenciada os dados podem estar em Qualquer 
partição, então o coitado do RDBMS  vai ter ler as partições uma a uma, 
começando pela primeira, depois pela segunda, depois pela terceira - ou seja, 
ao invés de um único "I/O longo lógico" num único segmento ele vai ter que 
acessar/ler N segmentos a mais para encontrar os dados, é bem possível que 
neste cenário a performance piore Brutalmente
  
   []s
   
 Chiappa
 
OBS : claro, há também a utilização do Particionamento como ferramenta 
administrativa - por exemplo, usar o recurso de rapidamente "transformar" uma 
dada partição numa tabela, que pode ser backupeada/arquivada separadamente, ou 
transformando uma tabela de trabalho numa Partição para cargas rápidas, etc), 
mas isso em princípio não traz vantagem direta para os usuários finais, então 
dificilmente pode ser elencado como recurso crítico, mas existe também.

--- Em oracle_br@yahoogrupos.com.br, Wanderson Barrence  escreveu
>
> Olá Pessoal,
> 
> Alguém sabe como eu faço para definir as tabelas que são candidatas a serem
> particionadas?
> Essas tabelas são definidas por quantidade de linhas, tamanho em MB ou
> quantidade de acesso?
> 
> Att,
> --
> Wanderson Barrence
> DBA Oracle 10g/11g
> Analista de Testes - CBTS
> --
> MSN: wbarrence@...
> ICQ: 170821994
> Linkedin: http://br.linkedin.com/in/wbarrence
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>