tunig query simples

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
ccguedes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Qua, 12 Ago 2009 1:42 pm
Localização: SP

Pessoal, boa tarde.
Tenho uma duvida em uma query bem simples.

Segue:

Selecionar tudo

select * 
  from cadastro_pessoa 
 where replace(replace(replace(num_ident,'.',''),'/',''),'-','') = '5478856321';
Este select tem um id, que é id_cad_pessoa, mas realmente buscamos dados atraves do num_ident, que é o Rg ou CPF e este campo tem traços, pontos e virgula, por isso o replace.

Acontece q esta query demora 15 segundos para me retornar dados, alguém tem uma ideia como consigo resolver isso, não conheço muita coisa de tuning ou quase nada, poderiam me ajudar?
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá,
A grosso modo, a utilização de índices que determina a otimização da consulta.
É necessário tanto a construção correta das tabelas e índices como correta utilização de joins nos relacionamentos.
No seu caso, é interessante saber se o campo "num_ident" possui algum índice.
De qualquer forma, procure NUNCA UTILIZAR FUNÇÔES EM CIMA DE CAMPOS COM ÍNDICES para fazer junções.
Quando se faz , como você fez:

Selecionar tudo

replace(replace(replace(num_ident,'.',''),'/',''),'-','') = '5478856321';
qualquer índice que tivesse neste campo seria ignorado por conta das funções sobrepostas a ela.
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

@ccguedes

Existem vários tipos de índices no Oracle Database, e somente 1 deles é que você conseguirá usar para otimizar a sua consulta, se neste caso você não puder eliminar as funções sobre a coluna "num_ident". Crie um índice baseado em função. Segue abaixo um exemplo de como criá-lo:

Selecionar tudo

CREATE INDEX SCHEMA.IX_NOME ON TABELA([b]replace(replace(replace(num_ident,'.',''),'/',''),'-','') = '5478856321' [/b]);
[]S
Responder
  • Informação
  • Quem está online

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