Pregunta

¿Hay alguna manera de mejorar este tipo de rendimiento de la consulta SQL:

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

El problema es cuando tengo muchos datos en mi mesa (al igual que millones de filas), la ejecución de la cláusula WHERE NOT EXISTS si es muy lento. Tengo que hacer esta verificación porque no puedo insertar datos duplicada.

Yo uso SQL Server 2005

THX

¿Fue útil?

Solución

Asegúrese de que está buscando en columnas indizadas, sin manipulación de los datos dentro de esas columnas (como subcadena, etc.)

Otros consejos

De la parte superior de mi cabeza, usted podría 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

Trate de reemplazar el NO EXISTE con unirse a un exterior izquierdo, a veces se comporta mejor en grandes conjuntos de datos.

prestar atención a la otra respuesta con respecto a la indexación. NO existe es normalmente bastante rápido si tiene buenos índices.

Pero I Tienes tenido problemas de rendimiento con declaraciones como la que describes. Uno de los métodos que he utilizado para moverse por que se va a utilizar una tabla temporal de los valores candidatos, realizar una DELETE FROM ... donde existe (...), y luego insertar a ciegas el resto. Dentro de una transacción, por supuesto, para evitar las condiciones de carrera. Dividir las consultas a veces permite que el optimizador para hacer su trabajo sin confundirse.

Si se puede en absoluto reducir el espacio del problema, entonces usted obtendrá un montón de rendimiento. ¿Estás absolutamente seguro de que cada una de las filas de esa tabla necesita ser comprobada?

La otra cosa que puede que desee probar es un DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria> antes de su inserción. Sin embargo, su experiencia puede variar

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

.. puede ser más eficiente. Como otros han dicho, que los índices de que usted tiene en cualquier campo de búsqueda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top