Ajuda com o Plano de Execução
25/11/2004
0
DELETE FROM Clientes_Avisos
WHERE EXISTS (
SELECT * FROM #TMP_Clientes B
WHERE Clientes_Avisos.Cod_Empresa = B.Cod_Empresa
AND Clientes_Avisos.Cod_Cliente = B.Cod_Cliente )
AND Clientes_Avisos.Cod_Empresa = 3
A tabela Clientes_Avisos possui somente 67904 registros e a tabela
temporária TMP_Clientes possui aproximadamente 15000 registros.
Simplês, mas quando executo o script acima, ele leva mais de 24 minutos para terminar.
Analisando o Plano de Execução, encontrei um Table Spool/Lazy Spool com as seguintes informações:
Physical operation: Table Spool
Logical operation: Lazy Spool
Row count: 491.125.546
Estimated row size: 15
I/O cost: 1,00
CPU cost: 3,00
Numbers of executes: 33254
Cost: 3,0000000(0¬)
Subtree cost: 6,0
Estimated row count: 1
Alguém tem alguma sugestão para melhorar isso?
Att
Roberto
Robertolucio
Curtir tópico
+ 0Posts
26/11/2004
Marcus.magalhaes
Vc pode criar índices para melhorar esta performance.
Onde vc poderia ter índices por cod_empresa + cod_cliente.
Ex.:
[color=red:2762b88ce2]Create Nonclustered Index idx_cli on CLIENTES_AVISOS (cod_empresa, cod_cliente)
Create Nonclustered Index idx_temp On #TMP_CLIENTES (cod_empresa, cod_cliente)[/color:2762b88ce2]
Espero ter ajudado.
Att,
Gostei + 0
26/11/2004
Robertolucio
Gostei + 0
01/12/2004
Laertepjunior
Se entendi bem..vc faz um join na #tmp_clientes com a clientes_avisos pra depois eliminar. Pq não elimina tudo no join
Ex
DELETE A FROM Clientes_Avisos A, TMP_Clientes B
WHERE WHERE A.Cod_Empresa = B.Cod_Empresa
AND A.Cod_Cliente = B.Cod_Cliente
AND A.Cod_Empresa = 3
DELETE FROM Clientes_Avisos
WHERE EXISTS (
SELECT * FROM TMP_Clientes B
WHERE Clientes_Avisos.Cod_Empresa = B.Cod_Empresa
AND Clientes_Avisos.Cod_Cliente = B.Cod_Cliente )
AND Clientes_Avisos.Cod_Empresa = 3
Gostei + 0
02/12/2004
Marcus.magalhaes
Fiz o teste e não há ganho de performance em se fazer o Join, ao contrário, o otimizador não conseguiu resolver muito bem este processo.
Att,
Gostei + 0
02/12/2004
Laertepjunior
Valeu
E no meu plano de execuça dos dois ficou bastate parecido !!!!!
Gostei + 0
02/12/2004
Marcus.magalhaes
Pode ser pelo volume de dados.
Pq qdo vc faz um join ele gera um conjunto de relacionamento para poder trata-lo...assim se vc faz um join de uma tabela de 100000 de linhas com outra de 10, vai demorar, pois ele vai fazer o acesso à 100000 para verificar se existe relação.
Mas tb é uma saída válida.
Att,
Gostei + 0
03/10/2007
Ricsant
meu email: ricsant03 arroba gmail ponto com
obrigado
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)