Indice

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
Avatar do usuário
heraldoaraujo
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Dom, 19 Fev 2012 12:10 pm

boa tarde turma,

Eu tenho um problema e gostaria de compartilhar aqui.
Tenho uma tabela em que o usuário faz uma consulta por filtro, a partir de qualquer coluna. Só que nem todas tem índice pelo simples fato de ocupar muito espaço pois falo de tabelas que contém mais de 500 mil registro. Tem alguma solução que possa resolver esse problema?
O oracle tem alguma solução?
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Heraldo,

Se o usuário pode fazer qualquer tipo de filtragem, não vejo como você poderia indexar todas as colunas da tabela em questão. Entre os motivos para não criar índices pode-se citar:

- Espaço em disco;
- Impacto negativo na performance para operações na tabela de INSERT,DELETE,UPDATE;
- O filtro aplicado pelo usuário. Você pode ter um campo NOME e ele deseja filtrar tudo que tenha '%ANTONIO%' no nome;
- A cardinalidade da coluna. Por exemplo, você tem a coluna SEXO e 50% de seus dados são HOMENS e o resto MULHERES. A cardinalidade (valores distintos) seria muito baixa, e o ORACLE nem se daria ao trabalho de acessar o índice;

Então, o que acho que resta a você é indentificar colunas com ALTA CARDINALIDADE que eventualmente ajudaria o ORACLE a filtrar os dados na eventualidade de um filtro ser aplicado nesta coluna. Não recomendaria indexar nenhuma coluna VARCHAR2 de grandes extensões (ex: ENDERECO, CIDADE,etc). Ou então que o usuário pudesse aplicar "coringas" do tipo LIKE (ex: NOME LIKE %SALGADO%')

Pode ser que mesmo assim, você não deseje criar índices adicionais, pois receia que eles impactem na performance da sua tabela. Dependendo da sua necessidade dos dados precisarem estar atualizados, você poderia então criar uma MATERIALIZED VIEW (MV) que seria alimentada com os dados da tabela original no tempo D-1 (ontem). Na "tabela base" desta MV você poderia criar a quantidade de índices que você desejasse. Mas veja bem, creio que só valeria a pena criar uma MV se você não precisasse obter os dados em tempo real.

O que falei são mais sugestões e você não precisa seguir à risca. Creio que outras possoas aqui do forum podem ter outras opiniões ou sugestões sobre este mesmo tema.

Abraços,

Sergio Coutinho
Responder
  • Informação
  • Quem está online

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