Array
(
)

Ajuda com o Plano de Execução

Robertolucio
   - 25 nov 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

Marcus.magalhaes
   - 26 nov 2004

Bom dia Justino.

Vc pode criar índices para melhorar esta performance.
Onde vc poderia ter índices por cod_empresa + cod_cliente.

Ex.:

Create Nonclustered Index idx_cli on CLIENTES_AVISOS (cod_empresa, cod_cliente)

Create Nonclustered Index idx_temp On #TMP_CLIENTES (cod_empresa, cod_cliente)

Espero ter ajudado.

Att,

Robertolucio
   - 26 nov 2004

Oi Marcos, muito obrigado!!!!

Laertepjunior
   - 01 dez 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

Marcus.magalhaes
   - 02 dez 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,

Laertepjunior
   - 02 dez 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 !!!!!

Marcus.magalhaes
   - 02 dez 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,

Ricsant
   - 03 out 2007

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