indice em 2 tabelas

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
Avatar do usuário
heraldoaraujo
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Dom, 19 Fev 2012 12:10 pm

É possível criar um indice composto em 2 tabelas distintas por exemplo, coluna_1.tabela_1 e coluna_2.tabela_2 ?
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,

Talvez a primeira pergunta seja: "porque você precisaria de um índice que envolveria duas tabelas distintas?"

Se existisse tal tipo de índice, o mais correto de afirmar é que ele seria um tipo de "produto cartesiano". Como você conseguiria normalizar o relacionamento entre duas colunas de tabelas distintas? Como você espeficaria que o "registro 1" de uma tabela precisaria estar associado ao "registro 20012" da outra tabela?

Um índice estará sempre associado a uma tabela e geralmente tem o objetivo de agilizar consultas ou construir regras de integridade dos dados (PK/AK). Se por acaso eu precisar fazer joins de duas tabelas distintas, eu posso optar por criar índices distintos nestas duas tabelas, envolvendo os filtros do join (clausula WHERE).

Não tenho aqui em mãos um exemplo prático, mas se eu tenho duas tabelas que apresentam relacionamentos "muito para muitos", eu posso criar uma entidade intermediária (tabela de relacionamento).

Exemplo:

Selecionar tudo

[TABELA A]   ----- [TABELA A x B ] ----- [TABELA B]
No exemplo acima, a tabela "A x B" seria composta somente pelas colunas de join entre "A" e "B", e você poderia criar uma "PK composta" (primary key) ou um índice "AK composto" (unique) com estas colunas.

Espero que os foristas possam dar uma explicação melhor para sua dúvida,

Abraços,

Sergio
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

Heraldo,

Existe o índice bitmap join que permite indexar em uma tabela uma coluna de outra tabela relacionada. Veja abaixo um exemplo de como criá-lo:

Selecionar tudo

create bitmap index hr.emp_bm_idx on hr.employees(d.department_name )
      from hr.employees e, hr.departments d where e.department_id = d.department_id;
[]s
Avatar do usuário
heraldoaraujo
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Dom, 19 Fev 2012 12:10 pm

Muito obrigado pela dica,, era isso que procurava. Porém poderia por gentileza me explicar o trecho do comando

Selecionar tudo

hr.employees(d.department_name )
|
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

O script cria um índice na tabela HR.EMPLOYEES que contém dados da coluna department_name da tabela relacionada hr.departments (d), ok?

[]s
Avatar do usuário
heraldoaraujo
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Dom, 19 Fev 2012 12:10 pm

Fabio Prado,

Desde já agradeço a dica porém tentei criar o índice bitmap e o Oracle levantou o erro ora-25954 dizendo que deveria ter uma constraint de chave primária.
Na minha situação eu tenho uma tabela de (employees)1 para N(cursos), até ai eu posso criar uma constraint na tabela employees mas na tabela cursos não.
No cenário atual ainda é possível criar o indice bitmap?
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

Heraldo, para este caso infelizmente é necessário ter relacionamento entre as tabelas. Este tipo de índice é muito utilizado em queries de BDs OLAP que consultam tabelas fato e dimensões, cenários em que há a integridade referencial entre as tabelas.

[]s
Responder
  • Informação
  • Quem está online

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