Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ultra

cpu 100%

Recommended Posts

Bom dia companheiros,Acabo de receber uma terrível bronca do chefe aqui, e preciso de toda ajuda possível para resolver o problema.Nosso site tem um sistema de busca, onde estão 190.000 registros com uns 20 campos... quando a pessoa digita a busca, ela procura por nome, codigo, autor ou empresa. O problema é o seguinte: assim que ele clica em buscar, o ASP faz a busca em SQL e, dentre os 190.000 registros, resulta oque o usuário quer.... mas a busca demora minutos, e o usuário acaba fechando a janelaMas, mesmo fechando a janela o SQL continua a busca, e o processamento vai pro espaço, e aí outro usuário entra no site e faz outra busca...... sucessivamente, até o servidor ficar no 100% contínuosDúvidas:1- Tem como dar um STOP na busca SQL quando o usuário fechar a janela ?2- Há alguma maneira de limitar o processamento da CPU ?Estou trabalhando agora pra enxutar a string de busca (não fui eu quem fiz) mas preciso saber como resolvo essas 2 perguntas acima. Agradeço a colaboração.[]'s !!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Ultra,Suas dúvidas específicas não sei responder, mas você pode procurar otimizar essa busca:Limitando os campos de busca na consulta do usuário.Paginando o resultado em intervalos menores.Usando Recordset desconectado. (por sinal ví um tópico ontem no msdn que reduziu o tempo de uma consulta de 12 para menos de 1 segundo com esse recurso)Resumindo as strings de retorno.Outra coisa a analisar é se o processamento ocorre mesmo na consulta ao BD ou na montagem/concatenação do resultado. Por exemplo: se retornar 2000 registros o ASP sofre um overhead gigantesco para montar o resultado.Espero que seja útil.[]s,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito agradecido arrEstou adaptando suas idéias no meu site (ou pensando como fazê-lo) e será de grande ajuda mesmo ! Não consegui parar a busca do SQL, mas vou tentar filtrá-lo o máximo possívelSó não entendi esse conceito de Recordset desconectado.... já lí outros posts sobre isso mas não explicavam direito....... onde há alguma explicação completa sobre isso ?Mais uma vez muito obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Recordset Desconectado, é o famoso "getrows"você coloca os dados do Select dentro de uma matriz, e trabalha só com arrays.. e pode fechar a conexao com o banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas isso melhora o desempenho e livra o processamento da CPU ? A parte pesada do meu problema não é esta parte onde faço a Select ?Bom vo fazer uns testes..... valeu pela ajuda !

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Recordeset Desconectado usa a conexão o mínimo possível liberando recursos do servidor. Basicamente você usa a conexão só para popular o recordset e a fecha em seguida para depois percorrer os registros.Quando você abre o Recordset com o cursor no cliente pode usar essa técnica. Segue um trecho de exemplo:<%Set RS = Server.CreateObject("ADODB.Recordset")RS.CursorLocation = adUseClientRS.CursorType = adOpenStaticRS.LockType = adLockReadOnlySet Conexao = Server.CreateObject("ADODB.Connection")Conexao.Open (StrConexao)RS.Open "SELECT * FROM tabela ORDER BY Campo",ConexaoSet RS.ActiveConnection = Nothing ' Essa linha libera o RS da conexão, caso contrário o fechamento da conexão destruiria o Recordset.Conexao.CloseSet Conexao=NothingWhile NOT RS.EOFResponse.Write (RS("Campo") & "<br>")RS.MoveNextWendRS.CloseSet RS=Nothing%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra técnica para você descobrir se a demora é culpa do Banco de dados ou da manipulação dos registros é fazer uma página de testes com a consulta atual retornando apenas o primeiro registro.Se demorar mesmo assim a demora é no servidor de DB, se for rápida é o script.Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas eu to tentando fazer os testes aqui e ele dá erro na linha RS.CursorLocation = adUseClient (Erro: Os argumentos são incorretos, estão fora do intervalo aceitável ou estão em conflito.)Tenho que atualizar meu IIS ou Windows ? Pesquisei na internet e ví que precisava do MDAC, é verdade ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa1- SQL Server 20002- Xi a select tá um pouco grande, mas é necessário ficar assim pois coleta dados de outras tabelas3- sim.... paginação de 10 em 10

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom.... tenho uma tabela1 com 190.000 registros e uns 30 campos, e mais 2 tabelas (nome e empresa) com 2 campos cadaA Select faz busca em todos os campos da tabela1, e compara o código do nome e da empresa(tabela1) com as respectivas tabelas e retorna seu respectivo valor (nome e empresa)Como seria essa Limit que tem no MySql ? Aqui tou tendo lentidão do Sql mesmo, pois faço a select top 10 e mesmo assim demora a consulta

Compartilhar este post


Link para o post
Compartilhar em outros sites

como está seu sql??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom lá vai... tá um pouco grande :

 

sSQL =	"SELECT DISTINCT " & _  "Livro.id AS id, " & _  "titulo, " & _  "subtitulo, " & _  "num_paginas, " & _  "ISBN, " & _  "preco, " & _  "disquete, " & _  "cdrom, " & _  "imagem, " & _  "promocao, " & _  "esgotado, " & _  "empresa_id,  " & _  "recomendado, " & _  "lancamento, " & _  "data_lancamento, " & _  "subsegmento_id, " & _  "nome_id,  " & _  "mais_vendido, " & _  "empresa.nome AS empresa, " & _  "empresa.email, " & _  "empresa.url, " & _  "nome.nome AS nome, " & _  "Segmento.nome AS segmento,  " & _  "SubSegmento.nome AS subsegmento " & _	"FROM " & _  "Livro (nolock)" & _  "LEFT JOIN empresa (nolock) ON Livro.empresa_id = empresa.ID  " & _  "LEFT JOIN SubSegmento (nolock) ON Livro.subsegmento_id = SubSegmento.id  " & _  "LEFT JOIN Segmento (nolock) ON SubSegmento.segmento_id = Segmento.ID  " & _  "LEFT JOIN nome (nolock) ON Livro.nome_id = nome.ID " & _   "WHERE ( " & sCondicao & " ) AND (livro.ativo=1) and (empresa.ativo=1)"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas eu to tentando fazer os testes aqui e ele dá erro na linha RS.CursorLocation = adUseClient (Erro: Os argumentos são incorretos, estão fora do intervalo aceitável ou estão em conflito.)Tenho que atualizar meu IIS ou Windows ? Pesquisei na internet e ví que precisava do MDAC, é verdade ?ps.: Uso Windows Xp SP2

Compartilhar este post


Link para o post
Compartilhar em outros sites

onde você pega o valor de adUseClient ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora que ví, o código de onde copiei tinha um include para um adovbs.incAlí o adUseClient está como valor = 3 (está certo ?)

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que sim...muda pra adUseServer e roda a parada de novo

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas funciona???o que ta acontecendo é que ta pegando muitos dados mesmo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então marioufpa, com ou sem recordset desconectado continua a mesma coisa.... o mesmo tempo para retornar a buscaTalvez o problema seja mesmo a select, pois busca de varias tabelas mesmo, num deve ter jeito :( Mas valeu a ajuda ! O chefe aqui já esqueceu heheh

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.