Ajuda com o Plano de Execução
Tenho o seguinte script:
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
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
Curtidas 0
Respostas
Marcus.magalhaes
25/11/2004
Bom dia Justino.
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,
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
Robertolucio
25/11/2004
Oi Marcos, muito obrigado!!!!
GOSTEI 0
Laertepjunior
25/11/2004
Além dos indices
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
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
Marcus.magalhaes
25/11/2004
Bom dia Justino.
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,
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
Laertepjunior
25/11/2004
Estranho Marcos...fiz o teste aqui tb, criei a tabela Clientes_Avisos com os campos que estão no delete...gerei 20.000 linhas e fiz o teste com os dois deletes, cada um retirando 10.000. O primeiro, sem o join demorou 5 segundos..o segundo com o join 1 segundo.
Valeu
E no meu plano de execuça dos dois ficou bastate parecido !!!!!
Valeu
E no meu plano de execuça dos dois ficou bastate parecido !!!!!
GOSTEI 0
Marcus.magalhaes
25/11/2004
Bom dia Laerte.
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,
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
Ricsant
25/11/2004
mas rola fazer um select into para uma tabela temporária em java com prepared statement ou statement?
meu email: ricsant03 arroba gmail ponto com
obrigado
meu email: ricsant03 arroba gmail ponto com
obrigado
GOSTEI 0