- Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 10 anos, 3 meses atrás por Marcio68Almeida.
-
AutorPosts
-
6 de agosto de 2014 às 6:57 pm #106808Felipe da RosaParticipante
Bom dia PessoALL
Criei uma tabela chamada CURSOS_CONCOMITANTES
que tem os seguintes camposI_BASE_DADOS -PK
I_ENTIDADES – PK
I_SEQUENCIA – PK
I_CURSOS – FK TABELA CURSOS
I_CURSOS_CONCOMITANTES – CADA CURSO PODE TER VARIOS CURSOS CONCOMITANTES.CRIEI UM INDEX COM I_BASE_DADOS, I_ENTIDADES E I_CURSOS, para casos onde preciso saber quais os cursos concomitantes do meu curso.
Porém este indice nunca é usado, ele sempre usa o indice da pk fazendo range scan em I_BASE_DADOS E I_ENTIDADES.
Porque isso? minha quantidade de dados pode ser pouca e o otimizador decidir utilizar o indice da pk.Por favor, estou batendo cabeça com isso.
6 de agosto de 2014 às 9:41 pm #106810Fábio PradoParticipanteFelipe,
Preciso ver o SQL para te explicar porque o índice não está sendo usado. Mostre tbém o plano de execução, se possível! O fato de vc criar um índice não significa que ele será usado, ok? Por este motivo, é importante entender muito bem quando criar um índice para que ele seja realmente útil.
[]s
6 de agosto de 2014 às 9:53 pm #106816Felipe da RosaParticipanteO select é o :
SELECT * FROM CURSOS_CONCOMITANTES
WHERE I_DATABASES = 236
AND I_ENTIDADES = 10
AND I_CURSOS = 1Attachments:6 de agosto de 2014 às 9:53 pm #106817Felipe da RosaParticipantesegue anexo o plano de execução
6 de agosto de 2014 às 10:11 pm #106820Fábio PradoParticipanteIsso raramente acontece (criar um Indíce composto) e ele não ser utilizado. Faça um teste executando antes ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS; e veja se algo mudou.
Qto ao plano de execução, pare de usar este da ferramenta. Nele está faltando um monte de estatísticas. Gere o plano que indico no artigo Analisando o Plano de Execução para tunar instruções SQL.
[]s
8 de agosto de 2014 às 12:31 am #106822Marcio68AlmeidaParticipanteBoa tarde.
Temos que levar em conta que o banco de dados não é algo estático, ele possui uma inteligência que o permite tomar decisões sobre a melhor forma de atuar em cada atividade.
Assim sendo, se você possui uma tabela com milhões de registros, é bastante provável que ele vá procurar o índice que faça o retorno em uma performance mais satisfatória, porém, quando você possui uma tabela com poucos registros (que imagino seja o caso) então o banco pode entender que, se jogar tudo na memória e fazer um full scan na tabela será muito mais rápido do que buscar as informações no índice e depois complementar as informações da tabela.
No seu caso, ele está utilizando a PK, que é extremamente semelhante ao índice, a escolha do banco pode dizer muito, inclusive sobre a sua escolha na formação do índice.
Para experimentar, recrie esse índice com as colunas em ordem diferente das da PK, muito provavelmente o banco buscará esta outra forma de pesquisar.
Também existe um recurso, que normalmente eu não recomendo que é o HINT, forçando o banco a utilizar um determinado índice.
Eu apostaria na redefinição da sua estrutura de dados e/ou índices… -
AutorPosts
- Você deve fazer login para responder a este tópico.