[oracle_br] Re: Criar VIEW

2013-05-03 Por tôpico J. Laurindo Chiappa
  Explica melhor : vc está falando de views "comuns", que são criadas com 
CREATE VIEW nomedaview AS (querydesejada); , views essas que nada mais são do 
que textos de SELECTs armazenados no database, ** OU ** vc está se referendo à 
VIEWS MATERIALIZADAS que Guardam os resultados de um SELECT ??? E seja qual for 
o tipo de view que vc se refere, qual é o seu objetivo aqui, é "proteger" os 
programadores de acessar as tabelas reais ??? Ou qual é ??
   Sobre parametrização, vc as "parametriza" da mesma maneira que qquer 
consulta SQL, ie : OU vc usa uma sub-query que lê os dados de uma outra tabela 
preparada antes,  OU coloca BINDS no texto da query (via packaged global 
variables, por exemplo) OU usa funcionalidades do RDBMS que permitem passar um 
valor escalar pro SQL engine (por exemplo, referenciando um Context, ou mesmo 
usando os placeholders nativos do RDBMS, como a string que vc pode guardar na 
coluna CLIENT_INFO da V$SESSION, que é um objeto in-memory e dinâmico 
Até é possível, também, se usar construtos PL/SQL, como um Array que vc 
extende /cria antes de executar a query e na query da view vc o converte para 
um TYPE com CASt ou quetais, mas eu ** detesto ** coisas que envolvem context 
switching entre SQL e PL/SQL

 []s
 
Chiappa


--- Em oracle_br@yahoogrupos.com.br, Elcio Francisco  
escreveu
>
> Pessoal seguinte estou precisando de criar uma view. Acreditem nunca usei 
> view, gostaria de saber como eu faço pois na query tem os filtros como posso 
> criar a view e passar os filtros
> par ela. Nos filtros eu passo um periodo e um codigo de empresa.
> 
> Muito Obrigado
> 
> Versao do oracle : 10g
>  
> Elcio Francisco 
> Analista de Sistemas 
> Multicrédito
> Belo Horizonte - MG
> 
> P Antes de imprimir pense em sua responsabilidade com o MEIO AMBIENTE
>  Adote os 3Rs na sua vida: Reduza, Reutilize, Recicle!
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




[oracle_br] Re: Criar view!

2009-01-19 Por tôpico jlchiappa
Colega, antes de responder uma obs : iirc (e de acordo com
http://www.oracle.com/technology/products/oracle9i/daily/nov06.html )
views materializadas estão disponíveis em qquer edição do 9i (até na
fraquinha da Standard), então ** não há ** impedimento ao uso, de
forma alguma vc pode sair descartando logo de cara recursos
importantes do tipo, e ademais é TRANSPARENTE para a aplicação se o
SELECT está sendo feito em cima duma tabela, view normal, view
materializada, desde que o objeto seja permissionado um SELECT FROM
dele será aceito... A bem da verdade, extendendo a idéia um pouco,
alterações de storage/implantação física de modo geral (como adição
duma eventual tabela com os parâmetros, ou uma GTT de trabalho, etc)
pode muito bem ser que façam parte da solução, vc NÃO pode as
descartar logo de cara Isso é CATEGÓRICO...

  Bom, respondendo : a primeira coisa que a gente pensa é que, falando
sempre de views comuns, que só são um texto de SQL e nada mais, quando
vc faz, digamos, um SELECT nnn FROM view WHERE condição = tal, supondo
que a view é SELECT nnn FROM tabelareal WHERE codigo = x , o que o
banco vai executar é tipo  :
  
SELECT * FROM view WHERE condição = tal, supondo que a view é 

SELECT * 
  FROM (SELECT nnn FROM tabelareal  WHERE codigo = x)
 WHERE condição = tal;
 
 ou seja, há um merging, logicamente falando, e o banco pode optar por
ler a tabela real filtrando aonde codigo =x, e apenas depois disso
aplicar a condicao tal no resultset, OU pode fazer um "push" do
predicado, fazendo uma operação de leitura só com dois filtros de uma
vez : isso pode dar MUITA diferença se (digamos, por exemplo) só a
condição tal seja indexada, isso implicaria em fazer um full table
scan , talvez retornando um montão de linhas, e só depois usar a outra
condição indexada Recomendo vc tirar os planos de execução
completos em um e em outro caso, para vc ver a diferença entre uma e
outra execução, tente mudar de "lugar", passando para dentro ou para
fora da view os parãmetros, teste... Há também diversos parâmetros que
interferem/controlam esses comportamentos (como _COMPLEX_VIEW_MERGING
, _PUSH_JOIN_PREDICATE , _OR_EXPAND_NVL_PREDICATE) , eles podem ser
setados via ALTER SESSION na sua sessão apenas, para testes, teste as
várias opções, pesquise no metalink que vc acha algumas notas de
referência 
 
  A segunda coisa que a gente pensa é : vc ** não diz ** claramente e
exatamente como é que vc está passando os parâmetros para a view, mas
suponho que seja via BINDs - ora, já que dá diferença vc passar
diretamente o valor desejado ou usar binds, a gente pensa que há
HISTOGRAMAS, que estão sendo usados quando vc passa diretamente os
valores e não estão sendo usadas quando vc usa binds, talvez devido à
bind variable peeking, já que o 9i é plenamente capaz de usar
histogramas com binds : verifique essa possibilidade
  
  Em nenhuma das idéias acima te ajudando, tente *** simplificar ao
máximo *** o texto da sua view, tirando tudo que for extra, reduzindo
o número de colunas e tabelas sem interferir na performance, e mande
pra gente junto com o CREATE das tabelas e índices e um trechinho
PL/SQL que crie INSERTs pra gente tentar simular o seu caso É
importante apenas que seja uma versão SIMPLIFICADA, mandar pra cá uma
view de Produção não adianta de nada. ninguém tem nem tempo nem
disposição pra mexer numa coisa grande assim, mas uma versão reduzida
é tranquilo...
  
  []s
  
Chiappa
--- Em oracle_br@yahoogrupos.com.br, "Renata de Oliveira"
 escreveu
>
> Olá Chiappa, olá amigos!
> 
> Quero agradecer à todos pelas dicas aqui postadas
> Porém ainda não consegui solução para o problema dessa view
> 
> :-(
> 
> Dei uma lida nos artigos que indicaram, e em alguns materiais que 
> encontrei, mas vou explicar melhor a situação q tenho aqui:
> 
> Temos um sistema de BI, e o problema maior aqui é performance(tempo 
> de resposta péssimo...). Tenho uma view enorme, que para fazer o 
> cruzamento dos dados, faz join com mais 2 tabelas e uma outra view 
> tão mostruosa qto ela propria
> 
> Um relatório depende de dados desta view que estou tentando 
> melhorar, porém o tempo de resposta do mesmo está inaceitáveil.
> 
> Por isso eu estou em busca de soluções que me ajudem a melhorar o 
> problema, porém tenho algumas "restrições" para a busca desta 
> solução:
> 
> - não posso usar view materializada;
> - o objeto final com os resultados deve estar obrigatoriamente uma 
> view(pois o sistema de BI que solicitará essas informações, só faz 
> isso com consulta à uma tabela ou view(SELECT);
> 
> Qto à query, já fiz uma boa otimização, inclusive com o uso de 
> funções analiticas do oracle(lead), para não fazer uso de "order by, 
> group by e unions", que eu sei que prejudicam a performance. Porém, 
> não consegui ainda um resultado satisfatório.
> 
> Agora.qdo no teste do script da view, eu deixo  fixo os valores 
> que serão passados na consulta da view, essa tem um tempo aceitável, 
> pq a view é c

[oracle_br] Re: Criar view!

2009-01-19 Por tôpico Renata de Oliveira
Olá Chiappa, olá amigos!

Quero agradecer à todos pelas dicas aqui postadas
Porém ainda não consegui solução para o problema dessa view

:-(

Dei uma lida nos artigos que indicaram, e em alguns materiais que 
encontrei, mas vou explicar melhor a situação q tenho aqui:

Temos um sistema de BI, e o problema maior aqui é performance(tempo 
de resposta péssimo...). Tenho uma view enorme, que para fazer o 
cruzamento dos dados, faz join com mais 2 tabelas e uma outra view 
tão mostruosa qto ela propria

Um relatório depende de dados desta view que estou tentando 
melhorar, porém o tempo de resposta do mesmo está inaceitáveil.

Por isso eu estou em busca de soluções que me ajudem a melhorar o 
problema, porém tenho algumas "restrições" para a busca desta 
solução:

- não posso usar view materializada;
- o objeto final com os resultados deve estar obrigatoriamente uma 
view(pois o sistema de BI que solicitará essas informações, só faz 
isso com consulta à uma tabela ou view(SELECT);

Qto à query, já fiz uma boa otimização, inclusive com o uso de 
funções analiticas do oracle(lead), para não fazer uso de "order by, 
group by e unions", que eu sei que prejudicam a performance. Porém, 
não consegui ainda um resultado satisfatório.

Agora.qdo no teste do script da view, eu deixo  fixo os valores 
que serão passados na consulta da view, essa tem um tempo aceitável, 
pq a view é criada apenas com os dados que são necessários "naquele 
momento", e não com todos os registros. Já qdo esses parâmetros são 
passados na consulta, o tempo de resposta torna-se 
inaceitávelPor isso pensei em uma forma de montar uma "view 
dinâmica", ou recebendo parâmetros...sei lá

Alguém teria mais sugestões, agora q detalhei melhor o problema que 
tenho?!
A Base de Dados é 9

Se alguém tiver qq dica, eu agradeço.

Att, 

Renata de Oliveira


--- Em oracle_br@yahoogrupos.com.br, "jlchiappa"  
escreveu
>
> Colega, tem sim : veja vc, uma view normal ** nada mais é ** do 
que um
> texto SQL, uma query, texto esse que vai ficar armazenado no banco 
e
> cada vez que vc usar a view (num SELECT, num DML, não importa) o 
texto
> será recuperado e executado. Ora, nós sabemos que se pode usar
> variáveis numa query, tipo :
> 
> SELECT minhacoluna FROM empregador WHERE codigo = :V_COD_EMPREG;
> 
> aonde essa V_COD_EMPREG é uma variável, certo ? Já que view nada 
mais
> é do que um texto de query, logicamente vc pode usar o mesmo, 
apenas
> (óbvio) que não pode ser uma variável local, tem que ser algum 
tipo de
> variável GLOBAL do banco : veja em
> http://asktom.oracle.com/pls/asktom/f?
p=100:11:0P11_QUESTION_ID:1448404423206#6988525402226
> ,
> http://asktom.oracle.com/pls/asktom/f?
p=100:11:0P11_QUESTION_ID:4447489221109
> ,
> http://asktom.oracle.com/pls/asktom/f?
p=100:11:0P11_QUESTION_ID:906341500346611919
> ,
> http://asktom.oracle.com/pls/asktom/f?
p=100:11:0P11_QUESTION_ID:6160800568535
> e
> http://asktom.oracle.com/pls/asktom/f?
p=100:11:0P11_QUESTION_ID:21357698504675
> que há exemplos de views parametrizadas usando rotinas PL/SQL que
> retornam um valor (ao invés de variável propriamente dita), usando
> variável global em package, usando contexts (que são uma espécie de
> variável de sessão que vc pode criar)  
>  E óbvio, nada impede taambém que vc faça query tipo :
>  
>  SELECT minhacoluna FROM empregador WHERE codigo = (select numa
> tabelaauxiliar);
>  
>  e aí cada sessão bota os valores que quiser na tabelaauxiliar.
>  
>   []s
>   
> Chiappa
> 
> --- Em oracle_br@yahoogrupos.com.br, "Renata de Oliveira"
>  escreveu
> >
> > Olá pessoal, bom dia à todos!
> > 
> > Queria saber se consigo criar uma view(que não seja 
materializada, tem 
> > que ser view normal),que receba parâmetros?!
> > 
> > Pensei em uma view por funçãomas isso é possível?!
> > Alguém saberia me indicar links, ou documentos, onde eu possa 
> > encontrar mais informações?!
> > 
> > Obrigada,
> > 
> > Renata
> >
>




[oracle_br] Re: Criar view!

2009-01-15 Por tôpico jlchiappa
Colega, tem sim : veja vc, uma view normal ** nada mais é ** do que um
texto SQL, uma query, texto esse que vai ficar armazenado no banco e
cada vez que vc usar a view (num SELECT, num DML, não importa) o texto
será recuperado e executado. Ora, nós sabemos que se pode usar
variáveis numa query, tipo :

SELECT minhacoluna FROM empregador WHERE codigo = :V_COD_EMPREG;

aonde essa V_COD_EMPREG é uma variável, certo ? Já que view nada mais
é do que um texto de query, logicamente vc pode usar o mesmo, apenas
(óbvio) que não pode ser uma variável local, tem que ser algum tipo de
variável GLOBAL do banco : veja em
http://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:1448404423206#6988525402226
,
http://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:4447489221109
,
http://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:906341500346611919
,
http://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:6160800568535
e
http://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:21357698504675
que há exemplos de views parametrizadas usando rotinas PL/SQL que
retornam um valor (ao invés de variável propriamente dita), usando
variável global em package, usando contexts (que são uma espécie de
variável de sessão que vc pode criar)  
 E óbvio, nada impede taambém que vc faça query tipo :
 
 SELECT minhacoluna FROM empregador WHERE codigo = (select numa
tabelaauxiliar);
 
 e aí cada sessão bota os valores que quiser na tabelaauxiliar.
 
  []s
  
Chiappa

--- Em oracle_br@yahoogrupos.com.br, "Renata de Oliveira"
 escreveu
>
> Olá pessoal, bom dia à todos!
> 
> Queria saber se consigo criar uma view(que não seja materializada, tem 
> que ser view normal),que receba parâmetros?!
> 
> Pensei em uma view por funçãomas isso é possível?!
> Alguém saberia me indicar links, ou documentos, onde eu possa 
> encontrar mais informações?!
> 
> Obrigada,
> 
> Renata
>