[oracle_br] Re: Criar VIEW
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!
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!
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!
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 >