Array
(
)

Full-Text, Lentidão na busca de registros :(

Salsa
   - 27 jul 2006

Falae pessoal, estou tendo grandes problemas com a lentidão na busca de registros usando full-text.

Tenho uma tabela com varias colunas, dentre elas 2 chamadas:
descricao, e descricao_en, e criei um full-text usando essas duas colunas, que é onde faço a pesquisa por palavras.

O tamanho do campo de ambas, é de 4000, isso mesmo, preciso de um espaço grande para armazenamento de texto.
Tenho +/- uns 500mil registros.

No meu PHP eu faço o select, porem além do processo de busca ser lento d+, muitas vezes ele nao retorna nada, e quando eu dou um F5 no browser para atualizar a pagina, ele me retorna os resultados.

Alguem sabe o por que da lentidao? Alguem sabe por que muitas vezes ele nao retorna nada?

#Código

$comando1 = "SELECT TOP 10000 A.id, A.codigo, CAST(A.descricao AS TEXT) as descricao, CAST(A.descricao_en AS TEXT) as descricao_en , A.cd, A.catalogo, A.tipo FROM photos as A ";

$comando2 = "WHERE CONTAINS(A.descricao, ´$keywords´) OR CONTAINS(A.descricao_en, ´$keywords´) ";


valeuz :P

Salsa
   - 30 jul 2006

poxa... sera q ninguem sabe oq tah acontecendo? :(

Wagnerbianchi
   - 13 ago 2006

Olá Salsa,

Dois pareceres sobre seu problema.

O Microsoft Full-Text Engine é muito usado por se tratar de um tipo de serviço/índice que tem grande rapidez para recuperação de informações desmembradas em campos com tipos de dados TEXT.
O problema é que, vejo que o seu problema está no uso mesmo deste tipo índice em uma tabela que não é de histórico, mas sim, uma tabela que sofre também atualizações e exclusões, além de inserção de novos registros.

Bom, aí você me pergunta: ´Poxa, mas o que isso tem haver?´

Vamos lá...

Quando um novo registro é inserido, ´novas palavras devem ser atualizadas lá na árvore de índices, sendo, na verdade, você tem a inserção do seu registro mais a inserção das ´WORD-FINDS´, que são as palavras, nos índices, ou seja, o FULL-TEXT é um tipo de índice atualizável também. . .agora pense...pense, quando temos uma atualização, a coisa complica ainda MAIS :( !!!

O que é uma atualização ou UPDATE, não é um DELETE seguido por um INSERT?? Agora, junte tudo que já foi dito, mas levando em conta uma atualização de um registro. Putzzz, acho que precisaremos de um bando de memória para suportar tantos processos em concorrência...rs

Bom, o segundo ponto é que, lá no ´php.ini´ do php você uma opção que trata do time out do php. Com certeza, a lentidão está no banco, o que resulta num fechamento de conexão e desistência de resolução por parte do PHP. Quando você dá um refresh na tela a consulta se repete certo???

ahaaaaaaaaaa!!! Sua consulta não é mais AD HOC, ou seja, no primeiro momento sua consulta e plano de execução para ela ainda não estavam em cache!!! Quando você dá o refresh, o banco de dados somente chama o plano de execução que foi deliberado para tal consulta e traz os resultados com mais facilidade, ou seja, ele não percorre as palavras do índice (árvore binária) para reencontrá-las, o ´SGBD´ já sabe onde elas estão!!!

Muito bem, qualquer dúvida, continue o post. . .e. . .não se suicide, existe algumas implementação que podemos utilizar que provê fácil contorno em relação oa seu problema!!!

Uma dica: não execute nenhuma instrução SQL dentro da aplicação que não sejam aquelas que chama procedures, vc ganha tempo, modularidade e robustez em seu software, sendo web ou local!! Pense nisso!!

Um abraço!!!!