rapidas - SQL: mejore el rendimiento de las consultas NO EXISTE
optimizar inner join sql server (6)
¿Hay alguna manera de mejorar este tipo de rendimiento de consultas SQL?
INSERT
INTO ...
WHERE NOT EXISTS(Validation...)
El problema es cuando tengo muchos datos en mi tabla (como millones de filas), la ejecución de la cláusula WHERE NOT EXISTS
si es muy lenta. Tengo que hacer esta verificación porque no puedo insertar datos duplicados.
Yo uso SQLServer 2005
Gracias
Asegúrese de buscar en columnas indexadas, sin manipulación de los datos dentro de esas columnas (como subcadena, etc.)
Fuera de mi cabeza, podrías intentar 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
Intente reemplazar NO EXISTE con una combinación externa izquierda, a veces rinde mejor en conjuntos de datos grandes.
Preste atención a la otra respuesta con respecto a la indexación. NO EXISTE es típicamente bastante rápido si tiene buenos índices.
Pero he tenido problemas de rendimiento con declaraciones como las que describes. Un método que he utilizado para evitarlo es utilizar una tabla temporal para los valores candidatos, realizar un BORRAR DE ... DONDE EXISTE (...), y luego INSERTAR ciegamente el resto. Dentro de una transacción, por supuesto, para evitar condiciones de carrera. Dividir las consultas a veces permite que el optimizador haga su trabajo sin confundirse.
Si puede reducir su espacio problemático, obtendrá un montón de rendimiento. ¿Estás absolutamente seguro de que cada una de esas filas en esa tabla necesita ser revisada?
La otra cosa que podría querer probar es un DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria>
antes de su inserción. Sin embargo, su millaje puede variar
insert into customers
select *
from newcustomers
where customerid not in (select customerid
from customers)
..puede ser más eficiente. Como han dicho otros, asegúrese de tener índices en cualquier campo de búsqueda.