Pular para o conteúdo
  • Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 18 anos, 11 meses atrás por Marcio68Almeida.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #75216
    Anônimo

      Estou fazendo uma tela para pesquisa em uma tabela que cont?m
      dez colunas com mais ou menos umas 400.000 linhas de informa??o
      tendo sua configura??o de colunas Exibidas colunas Numericas… em outra
      tabela (estilo Data Warehouse)
      Para a tentiva de automatiza-lo construir uma fun??o que concatena
      todas as colunas que s?o tipo Texto criando uma ?nica string para
      compara??o.

      O Problema
      Como poderei proceder para uma compara??o em toda a extens?o
      dessa String de forma eficiente, uma vez que pesquisar por
      like(“%STRING%”) estarei perdendo perfomarce pela perda do indice

      Obrigada

      #75217
      ebertfm
      Participante

        Graciele, Boa tarde.

        Me perdoe, mas pelo texto n?o deu para entender o que vc est? querendo.

        Se eu entendi o que acho que entendi, vc que procurar um string qualquer dentro de uma concatena??o de valores de uma coluna.

        Ex.: select * from teste where campoa || campob like ‘%a%’;

        Se for simplesmente isso, n?o tem como usar ?ndice mesmo. Vai ter que varrer toda a tabela.

        Mas se n?o for isso, for por exemplo, vc precisa de uma chave ou outro campo:

        Exemplo select * from teste where chave=’a’ and campoa||campob like ‘%a%’;

        Sendo que o campo chave ? a chave da tabela.

        Ent?o ele vai usar o ?ndice. S? de vc ter este tipo de compara??o no where n?o significa que ele n?o vai utilizar um ?ndice.

        Veja um exemplo pr?tico na vers?o 9.2 do Oracle.

        SQL> create table teste (chave number primary key, campoa varchar2(10), campob varchar2(20));

        Table created.

        SQL> analyze table teste estimate statistics;

        Table analyzed.

        SQL> explain plan for
        2 select * from teste where chave = 10 and (campoa||campob like ‘%a%’);

        Explained.

        SQL> @utlxpls

        PLAN_TABLE_OUTPUT


        | Id | Operation | Name | Rows | Bytes | Cost |

        | 0 | SELECT STATEMENT | | 1 | 32 | 1 |
        |* 1 | TABLE ACCESS BY INDEX ROWID| TESTE | 1 | 32 | 1 |

        |* 2 | INDEX UNIQUE SCAN | SYS_C002259 | 1 | | |

        Pelo plano acima vc pode perceber que ele utilizar? o ?ndice de chave prim?ria da tabela.

        Por favor se n?o for isso sua pergunta, mande outro post.

        Espero ter ajudado.

        Abra?os.

        #75243
        Anônimo

          Bom dia

          É exatamente isto. Ele devera procurar um
          string qualquer dentro de uma concatenação de valores de uma coluna.
          Ex.: select * from teste where campoa || campob like ‘%a%’;

          Meu problema é o tempo que esta levando para
          fazer essa varredura na tabela. Gostaria de saber se
          existe algo que agilize esse processo

          Obrigada

          Graciela

          #75244
          Marcio68Almeida
          Participante

            A partir do momento que você coloca uma função na clausula WHERE, o índice vai para o espaço…
            Nesse caso específico, como disse nosso amigo ebertfm, não tem como fazer sem o auxílio de uma chave que limite o range da consulta…

            #75245
            ebertfm
            Participante

              Graciela, Boa tarde.

              No caso da query ser da forma como vc especificou no exemplo, não tem como usar índice. Ele tem que varrer a tabela toda.

              Desta forma vc estará fazendo um “full table scan” na tabela.

              Veja o plano que ele gera para esta query:

              PLAN_TABLE_OUTPUT


              | Id | Operation | Name | Rows | Bytes | Cost |

              | 0 | SELECT STATEMENT | | 1 | 32 | 2 |

              |* 1 | TABLE ACCESS FULL | TESTE | 1 | 32 | 2 |

              Imagine vc procurando um nome de uma pessoa num catálogo em que vc só tem parte do nome. Vc tem que ler TODOs os nomes do catálogo para vc achar os que parecem com aquela parte que vc tem. E é isso que ele faz.

              Bom, então está tudo perdido?
              Não. Vc pode repensar sua query para incluir algum campo mais restritivo como no meu exemplo, ou configurar o banco para responder melhor ao Full Table Scan.

              Para isso vc tem que configurar(ou melhorar a configuração) de parâmetros de memória da SGA.

              Pode ser o caso de vc ter que mexer também na configuração do servidor, aumentando memória ou melhorando o processador.

              No caso de aumento de memória vc precisa reconfigurar os parâmetros da SGA para que o efeito do aumento de meória possa ser melhor aproveitado pelo Oracle.

              Bom estes são assuntos que vc precisa dominar para mexer. Parte destas informações estão no Manual : Performance and Tunning do banco.

              Espero ter ajudado.

              Abraços.

              #75246
              Anônimo

                Muito Obrigada pela atenção e explicações

                Vou verificar a possibilidade de um campo como o exemplo
                e passar a diante a possibilidade de mudança de configurações
                e memoria. Pesquisarei também sobre Performance Tuning.
                Mas já é de grande avalia a experiencia transmitida
                Se consegui alguma informação a mais passo por aqui

                Obrigada

                Graciela

                #75247
                Marcio68Almeida
                Participante

                  Aproveitando…
                  É interessante ver a fragmentação da tabela e índices e desfragmenta-los caso seja necessário, isso também melhora a performace.
                  Mas nada como uma coluna ( ou várias ) como chave para fazer uma limitação no número de linhas a ser consultadas…

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