Pessoal bom dia,
Estou com um problema, tenho um update dentro de uma procedure que está lentíssimo, na verdade não acaba, já esperei duas horas e nada.
Eu tiro o update de dentro da procedure a mesma roda em 2 segundos.
Se eu rodo o update fora da procedure demoro 4 segundos.
O update irá alterar 30mil linhas, mas é um update simples:
UPDATE SERVICO SET INATIVO = '1'
FROM SERVICO
INNER JOIN EXCLUIR_SERVICOS ON EXCLUIR_SERVICOS.ID_SERVICO = SERVICO.ID_SERVICO
Já alterei o banco para SIMPLE e nada também.
Alguém tem alguma sugestão?
Obrigado.
--
----------------------
Você recebeu essa mensagem porque você esta inscrito no grupo "SQL Server Brasil" do Google Groups.
Para postar nesse grupo, envie mensagem para sql-serv...@googlegroups.com
Para sair desse grupo, envie mensagem para sql-server-bra...@googlegroups.com
Para mais opções, visite a página desse grupo em http://groups.google.com/group/sql-server-brasil
----------------------
You received this message because you are subscribed to the Google Groups "SQL Server Brasil" group.
To post to this group, send email to sql-serv...@googlegroups.com
To unsubscribe from this group, send email to sql-server-bra...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sql-server-brasil
Já consegui, obrigado.
Na verdade não era esse update que estava lento.
Tinha um update que tinha a mesma função, só que eu tentei melhorar o mesmo e fiz esse ai(criando uma tabela temporaria, apenas com os serviços que eu queria atualizar), só que eu tinha esquecido de comentar o antigo.
Mas de qualquer forma, o antigo também rodava manualmente em poucos segundos e dentro da procedure nada.
Dai tive que fazer essa mudança, dentro da procedure eu criei a temporaria e fiz o join com a temporaria.
De qualquer forma, eu já tinha olhado o sp_lock2, who, lock, rsrs, nem tinha ninguém conectado, é base teste ainda.
Update antigo:
UPDATE SGESERVI SET INATIVO = '1'
FROM TMPVIEW
RIGHT JOIN SGESERVI ON DBO.F_FORMATA_CODIGO(@MASCARA,RTRIM(CAMPO001) + RTRIM(CAMPO002)) = SGESERVI.CODIGO
AND SGESERVI.ID_SGEGRSER=@ID_SGEGRSER
WHERE 1=1
AND ISNULL(TMPVIEW.CAMPO001,'') = ''
AND ISNULL(SGESERVI.INATIVO,0) = '0'
and SGESERVI.ID_SGEGRSER=@ID_SGEGRSER
UPDATE NOVO:
SELECT SGESERVI.ID_SGESERVI AS ID_SGESERVI INTO #EXCLUIR_SERVICOS FROM SGESERVI
WHERE
SGESERVI.ID_SGEGRSER=4
AND CODIGO NOT IN ( SELECT DBO.F_FORMATA_CODIGO('##.##.###-#',RTRIM(CAMPO001) + RTRIM(CAMPO002)) FROM TMPVIEW )
AND ISNULL(SGESERVI.INATIVO,0) = '0'
UPDATE SGESERVI SET INATIVO = '1'
FROM SGESERVI
INNER JOIN #EXCLUIR_SERVICOS ON #EXCLUIR_SERVICOS.ID_SGESERVI = SGESERVI.ID_SGESERVI
Renan Henrique
Analista Desenvolvedor .Net/SQL
MCTS - Microsoft Certified Technology Specialist
GTalk - MSN: rena...@gmail.com
rs, gosto de utilizar o 1=1 porque posso comentar os AND para realizar testes.
Costumo usar table_alias, mas em algumas tabelas somente. O pessoal aqui já está acostumado a ler assim mesmo.
Enfim, a questão é que o update antigo não finaliza.
Acabei de mudar o contexto de transação para read uncommited, e nada.
Dei update manualmente em todos serviços, no caso não teria mais nenhum para dar update, sabe o que aconteceu?
Quando executo a procedure ela continua ficando travada com esse update:
UPDATE SGESERVI SET INATIVO = '1'
FROM TMPVIEW
RIGHT JOIN SGESERVI ON DBO.F_FORMATA_CODIGO(@MASCARA,RTRIM(CAMPO001) + RTRIM(CAMPO002)) = SGESERVI.CODIGO
AND SGESERVI.ID_SGEGRSER=@ID_SGEGRSER
WHERE 1=1
AND ISNULL(TMPVIEW.CAMPO001,'') = ''
AND ISNULL(SGESERVI.INATIVO,0) = '0'
and SGESERVI.ID_SGEGRSER=@ID_SGEGRSER
Dai comentei esse update, executou normal, coloquei o update melhor executou normal. RÁAA, vai saber.
MAS A PROCEDURE COM ESSE UPDATE AI TRAVA, MAS SE EU EXECUTAR MANUALMENTE, ELE EXECUTA NA HORA.
Por via das dúvidas, já coloquei na procedure sem variáveis, direto o valores dela.
O bom que eu comento isso com a galera de forum, parece que ninguém acredita, rs.