resueltos rendimiento rapidas plan optimizar optimización optimizacion mejorar mas inner ejercicios ejecución datos consultas sql sql-server performance where-clause not-exists

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.