Ajuda com o Plano de Execução

25/11/2004

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


Robertolucio

Respostas

26/11/2004

Marcus.magalhaes

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,


Responder Citar

26/11/2004

Robertolucio

Oi Marcos, muito obrigado!!!!


Responder Citar

01/12/2004

Laertepjunior

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


Responder Citar

02/12/2004

Marcus.magalhaes

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,


Responder Citar

02/12/2004

Laertepjunior

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 !!!!!


Responder Citar

02/12/2004

Marcus.magalhaes

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,


Responder Citar

03/10/2007

Ricsant

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


Responder Citar