Pergunta

Existe uma maneira eu posso melhorar este tipo de desempenho de consulta SQL:

INSERT
INTO ...
WHERE NOT EXISTS(Validation...)

O problema é quando eu tenho muitos dados em minha mesa (como milhões de linhas), a execução da cláusula WHERE NOT EXISTS se muito lento. Eu tenho que fazer esta verificação porque eu não posso inserir dados duplicados.

Eu uso SQLServer de 2005

thx

Foi útil?

Solução

Certifique-se de que você está procurando em colunas indexadas, sem manipulação dos dados dentro dessas colunas (como substring etc.)

Outras dicas

Em cima da minha cabeça, você poderia tentar algo como:

 TRUNCATE temptable
 INSERT INTO temptable ...
 INSERT INTO temptable ... 
 ...
 INSERT INTO realtable
 SELECT temptable.* FROM temptable
 LEFT JOIN realtable on realtable.key = temptable.key
 WHERE realtable.key is null

Tente substituir o NÃO EXISTE com uma junção externa esquerda, às vezes melhor desempenho em grandes conjuntos de dados.

Preste atenção à outra resposta sobre indexação. NÃO EXISTE normalmente é bastante rápido se você tem bons índices.

Mas eu Have teve problemas de desempenho com declarações como você descreve. Um método que eu usei para contornar isso é usar uma tabela temporária para os valores candidatos, executar um DELETE FROM ... ONDE EXISTE (...), e em seguida cegamente inserir o restante. Dentro de uma transação, é claro, para evitar condições de corrida. Dividindo-se as consultas às vezes permite que o otimizador a fazer o seu trabalho sem se confundirem.

Se você pode em tudo reduzir o espaço do problema, então você vai ganhar montes de desempenho. Você está absolutamente certo de que cada uma dessas linhas em que as necessidades de mesa a ser verificado?

A outra coisa que você pode querer tentar é um DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria> antes de sua inserção. No entanto, sua milhagem pode variar

insert into customers 
select * 
from newcustomers 
where customerid not in (select customerid 
                         from customers)

.. pode ser mais eficiente. Como já foi dito, faça índices certeza que você tem em todos os campos de pesquisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top