Pular para o conteúdo
  • Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 10 anos, 3 meses atrás por Avatar de Marcio68AlmeidaMarcio68Almeida.
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #106808
    Avatar de Felipe da RosaFelipe da Rosa
    Participante

      Bom dia PessoALL

      Criei uma tabela chamada CURSOS_CONCOMITANTES
      que tem os seguintes campos

      I_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.

      #106810
      Avatar de Fábio PradoFábio Prado
      Participante

        Felipe,

        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

        #106816
        Avatar de Felipe da RosaFelipe da Rosa
        Participante

          O select é o :
          SELECT * FROM CURSOS_CONCOMITANTES
          WHERE I_DATABASES = 236
          AND I_ENTIDADES = 10
          AND I_CURSOS = 1

          Attachments:
          #106817
          Avatar de Felipe da RosaFelipe da Rosa
          Participante

            segue anexo o plano de execução

            #106820
            Avatar de Fábio PradoFábio Prado
            Participante

              Isso 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

              #106822
              Avatar de Marcio68AlmeidaMarcio68Almeida
              Participante

                Boa 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…

              Visualizando 6 posts - 1 até 6 (de 6 do total)
              • Você deve fazer login para responder a este tópico.
              plugins premium WordPress