View com union all

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Boa tarde amigos do Fórum,

Tenho uma view que foi construída com base num select com union all, o q temos certeza é que o dado a ser procurado está em apenas um dos selects, dependendo da origem pode estar na tabela1 ou na tabela2, pois bem, o que eu gostaria de saber é se tem como eu chamar apenas o select que eu quero em tempo de execução antes da chamada da view melhorando o tempo de execução e o custo desta view.

Selecionar tudo

create or replace view vw_teste as
select a,b,c,d from tabela1
union all
select a,b,c,d from tabela2;
Aqui é o Oracle 11g.

Obrigado por enquanto.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Cara,
De alguma forma você terá que fazer uma consulta para verificar a origem. Então apenas um select não será possível.
Teria que passar como parâmetro pro select a condição de origem para deixar mais performático, ou seja, excluir de cara todo o select pela origem.

De qualquer forma acredito que você precisa revisar todo seu select, com condições, indices, e etc.
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Eu já testei passando um parâmetro, neste sentido não muda nada, ele executa as 2 consultas, todas as possibilidades de índice já foram tratadas, mas não tem problema, vou tentar resolver de outra forma, obrigado pela resposta.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Boa tarde.

Você diz que, dependendo da origem, pode estar no select 1 ou 2.
Bom, neste caso, você consegue saber antes, qual essa origem e, qual o select afetado?

Caso positivo, poderia adicionar uma coluna "informativa" na view, por exemplo:

Selecionar tudo

create or replace view vw_teste as
select a,b,c,d,1  as codigo from tabela1
union all
select a,b,c,d, 2 as codigo from tabela2;
Com isso, sabendo-se do que se trata, poderia fazer um "where" pelo codigo e, consequentemente creio que esta consulta poderia ficar mais rápida.

Qualquer coisa, manda pra gente.

Abraço,
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

ballboas escreveu:Eu já testei passando um parâmetro, neste sentido não muda nada, ele executa as 2 consultas, todas as possibilidades de índice já foram tratadas, mas não tem problema, vou tentar resolver de outra forma, obrigado pela resposta.
Então, a idéia é não usar a view da forma atual.
Seria algo como "rodar" o select da propria view passando o parametro de origem, já que você sabe quais são as origens de cada condição.
Poderia até fazer uma condição mais bruta tipo:

Selecionar tudo

Select ...
from ...
where 1 = DECODE(&P_ORIGEM,'UM', 1,0)
..
UNION ALL
Select ...
from ...
where 1 = DECODE(&P_ORIGEM,'DOIS', 1,0)
..
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Fala galera do Fórum, bom primeiramente gostaria de me desculpar, a hora q eu falei q já tinha testado passando um parâmetro foi em um teste q eu estava fazendo usando o "with" e neste caso, não dá certo, depois de ler as respostas no fórum fui fazer o teste com o parêmetro e deu certinho, hehehe.... O custo da view caiu pela metade.

Obrigado Trevisolli e Noctifero pelas respostas e desculpem mais uma vez. Abraço.
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Só para mostrar o resultado ficou assim

Criação da View

Selecionar tudo

create or replace view vw_teste as
select a,b,c,d, 1 e from tabela1
union all
select a,b,c,d, 2 e from tabela2;
Uso da View buscando somente do primeiro select

Selecionar tudo

select * 
  from vw_teste
where a  = :p_a
    and e = 1;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes