- Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 18 anos, 11 meses atrás por Marcio68Almeida.
-
AutorPosts
-
8 de fevereiro de 2006 às 10:26 pm #75216Anô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 indiceObrigada
8 de fevereiro de 2006 às 11:14 pm #75217ebertfmParticipanteGraciele, 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.
13 de fevereiro de 2006 às 5:25 pm #75243AnônimoBom 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 processoObrigada
Graciela
13 de fevereiro de 2006 às 5:43 pm #75244Marcio68AlmeidaParticipanteA 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…13 de fevereiro de 2006 às 6:37 pm #75245ebertfmParticipanteGraciela, 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.
13 de fevereiro de 2006 às 7:51 pm #75246AnônimoMuito 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 aquiObrigada
Graciela
13 de fevereiro de 2006 às 8:06 pm #75247Marcio68AlmeidaParticipanteAproveitando…
É 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… -
AutorPosts
- Você deve fazer login para responder a este tópico.