SQL - melhorar NÃO EXISTE desempenho da consulta
-
23-08-2019 - |
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
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.