Update em procedure lento

109 views
Skip to first unread message

Renan Henrique

unread,
Nov 4, 2011, 7:08:21 AM11/4/11
to sql-serv...@googlegroups.com

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.

               

               

Jefferson Montija Cirilo

unread,
Nov 4, 2011, 8:18:50 AM11/4/11
to sql-serv...@googlegroups.com
Bom dia Renan,
 
    Você já observou se não está com lock (exec sp_who)?
    Tem alguma outra coisa que pode influenciar no update, como trigger? São muitos dados?
    O seu update é bem simples... dê uma olhada, principalmente no lock.
 
Atenciosamente,
 
Jefferson
--
----------------------
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

Renan Henrique

unread,
Nov 4, 2011, 7:36:21 AM11/4/11
to sql-serv...@googlegroups.com

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 

 

Jefferson Montija Cirilo

unread,
Nov 4, 2011, 9:10:15 AM11/4/11
to sql-serv...@googlegroups.com
Maravilha.
 
Gostei do seu "WHERE 1=1". :-)
Só uma observação, sei que muita gente gosta assim, mas você não costuma usar alias nas tabelas (table_alias)?
As vezes economiza na digitação, mas PODE atrapalhar um pouco no entendimento do comando.
 
Bom, em todo caso, pelo Execution Plan você pode ter uma comparação bem legal sobre qual é mais "performático" ou se são iguais.
 
Qualquer coisa, estamos aí.

Renan Henrique

unread,
Nov 4, 2011, 8:22:56 AM11/4/11
to sql-serv...@googlegroups.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.

Reply all
Reply to author
Forward
0 new messages