Ajuda com consulta SQL - lentidão

Pessoal é o seguinte, estou precisando de uma ajuda, para fazer com que o processo não seja muito lento.

Atualmente tenho uma tabela chamada LOG, nela é armazenado tudo o que o usuário faz, por exemplo se ele clicou em uma página, é salvado nessa tabela log, ou seja, essa tabela é gigante!.
O problema é que não foi eu quem começou e criou esse projeto e o banco de dados do mesmo.

e o nome do usuário fica armazenado na própria menssagem. a tabela está nesse formato.

Reparem que o nome de usuário está dentro da menssagem.

Agora vamos ao problema, eu preciso fazer um filtro, para que o admin do sistema, selecione somente os Logs do usuário da cidade X que o ADMIN selecionar.

atualmente eu pego a mensagem inteira, separo o nome do usuário, testo se ele pertence a cidade, se pertencer insiro em um arraylist, e depois só utilizo o conteúdo do arraylist.

dessa forma, é necessário percorrer a tabela LOG inteira do mesmo jeito.

existe uma maneira de em uma consulta sql, separar o nome da pessoa, e já pegar a cidade do mesmo?

pois dessa forma, a geração do relatório fica muito lenta.

obrigado desde já.

abraços

cara,

nao tem como vc adcionar um campo nessa sua tabela? pq se tiver, basta vc criar um campo usuario e setar o usuario que executou a ação.

t+

Se o nome da pessoa estiver sempre naquela posição você teria que utilizar substring. [=

Uma solução é criar a coluna usuário e criar um update fazendo substring da mensagem para pegar o usuário. Antes disso seria bom alterar o sistema para colocar o nome do usuário na nova coluna.

Não adianta vc quebrou a formas normais.
ou vc normaliza ou ficarár lento mesmo.
Diz a primeira forna normal de Banco de dados, que não podemos ter atributo multi valorado e nem composto.
No seu caso vc quebrou a 1 primeira forna normal, olha que ainda temo mais 4 rsrs.
A sugestão seria normalizar pelo menos a primeira forna normal, eleminando o atributo composto ai.
Vamos imagina que temos o seguinte valor:

“Usuario:Um|Cidade:SãoPaulo|Estado:SP”;
Esse atributo é composto de 3 valores, vc teria um like em cidade, o banco não é vudu para otimizar a busca com like, ou seja ele vai ter que varrer.
Bom agora se você criasse 3 campos para esse exemplo: usuario,cidade,estado
e criasse um sql com like para cidade, ja comecaria a otimizar as buscas.

Mas com certeza não poderá normalizar por algum motivo, então acho que cache te ajudaria um pouco.
Mas isso é loucura, log em Banco de dados, e a rotação do log como fica? rsrs

Então pessoal, realmente esse projeto está um lixo. peguei ele agora, e já foi feito dessa maneira.

acredito que se eu criar uma nova coluna, as informações que ja foram inseridas não seriam 100% confiaveis, correto?

Confiavel? rsrss, já não está, mas não teria dados anomalicos, já que você iria tirar da tripona e add em outra coluna.
Bom vc disse que teria usuario, então pode criar um campo para usuário que ja seria um melhoria, agora se o usuário tivesse um Dominio o dominio seria bem legal também.
pq ficaria algo:

where text like :paramLike and user.dominio = :paramDominio

Abraços

cara,

adicionando a nova coluna diminuiria seu problema, depois é so vc fazer um update para atualizar essa coluna utilizando substring.

t+

e depois de separar o nome do usuário de coluna. como faria para selecionar o id da cidade desse usuário

tabelas:
LOG
CIDADE
USUARIO
USUARIO_CIDADE;

Quero selecionar somente os logs dos usuários que pertencem a cidade X.

Att,

cara,

segue o sql.

select l.* // considerando que a coluna usuario seja valor unico na tabela de Usuario
from Log l
join Usuario u on (l.usuario = u.usuario)
join Usuario_Cidade uc on (uc.idUsusario = uc.idUsuario)
join Cidade c on (c.idCidade = uc.idCidade)
where c.nome = 'Belo Horizonte'

t+