Desempenho de consulta

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Galera, assim.

Estou montando um select de um cadastro de pessoas.

Mostro o código, nome, data de nascimento e idade.

Para o cálculo da idade eu criei uma função chamada idade, onde passo como parâmetro a data de nascimento e a data de referência.

Porém eu preciso que essa consulta mostre somente pesoas entre 10 e 20 anos por exemplo.

Estou fazendo assim:

Selecionar tudo

select cd_usuario, nm_usuario, dt_nascimento, idade(dt_nascimento, sysdate)
where idade(dt_nascimento, sysdate) between 10 and 20
esse caso da idade é só um caso que preciso agora, mas seguidamente precisso do seguinte, se há a possibilidade de armazenar o resultado da função de forma a não ser necessário chamá-la de novo para fazer o critério, pois desta forma o banco está realizando o cálculo duas vezes o que prejudica o desempenho da query.

Obrigado.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

ops, esqueci do from na consulta, mas desconsiderem porque não interfere na pergunta, rsrs.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

prejudica quanto?

você pode estudar a criação de uma view materializada.. sinceramente eu não gosto..

a sua tabela tem indices?

esse campo dt_nascimento é um indice?
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Você quer q a função não seja chamada no where da query???
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

prejudica quanto?

você pode estudar a criação de uma view materializada.. sinceramente eu não gosto..

a sua tabela tem indices?

esse campo dt_nascimento é um indice?
Na verdade não cheguei a calcular realmente quanto do desempenho é afetado, claro que nesse caso da idade não muita coisa, mas em tabelas maiores com cálculos maiores sim, porque para informar a função no critério o banco refaz todo o cálculo de novo.

Sobre os índices, dt_nascimento não está indexado.
Você quer q a função não seja chamada no where da query???
Exatamente. Por exemplo: se no select o resultado da função foi 20, eu queria passar esses 20 lá na clausula where, sem a necessidade de chaamr novamente a função e refazer o cálculo.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Você poderia usar uma subquery:

Selecionar tudo

select *
from
(
  select cd_usuario
         , nm_usuario
         , dt_nascimento
         , idade(dt_nascimento, sysdate) idade
  from tabela
)
where idade between 10 and 20 
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Ah.. só lembrando que, dependendo da função, ela poderia ser criada com a cláusula deterministic, desde que, sempre para um mesmo conjunto de entradas, o retorno seja sempre o mesmo.
Neste caso, ao invés de realizar uma nova chamada à função com o mesmo parâmerto, o banco utiliza valores já calculados anteriormente, economizando tempo de processamento.

Dependendo do número de vezes em que a função é chamada, e do número de parâmetros distintos que ela recebe como entrada, o ganho pode ser considerável.

Selecionar tudo

http://rwijk.blogspot.com/2008/04/deterministic-clause.html
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Interessante essa parte do deterministic, não conhecia.

Fiz uns testes aqui e realmente poupou processamento.

Vlw.
Responder
  • Informação
  • Quem está online

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