que tienen la siguiente declaración para encontrar nombres inequívocos en mis datos (~ 1 millón de entradas):¿Por qué el costo de SQL explota con el simple "o"?
select Prename, Surname from person p1
where Prename is not null and Surname is not null
and not exists (
select * from person p2 where (p1.Surname = p2.Surname OR p1.Surname = p2.Altname)
and p2.Prename LIKE CONCAT(CONCAT('%', p1.Prename), '%') and p2.id <> p1.id
) and inv_date IS NULL
Oracle muestra un enorme costo de 1477315000 y ejecución no termina después de 5 minutos. Basta con dividir el quirófano en una propia existe el rendimiento aumenta subcláusula a 0,5 s y costos a 45000:
select Prename, Surname from person p1
where Prename is not null and Surname is not null
and not exists (
select * from person p2 where p1.Surname = p2.Surname and
p2.Prename LIKE CONCAT(CONCAT('%', p1.Prename), '%') and p2.id <> p1.id
) and not exists (
select * from person p2 where p1.Surname = p2.Altname and
p2.Prename LIKE CONCAT(CONCAT('%', p1.Prename), '%') and p2.id <> p1.id
) and inv_date IS NULL
No es mi pregunta para ajustar esto a lo mejor, ya que es sólo una consulta rara vez ejecutado, y yo sé que CONTACT está superando cualquier índice, pero me pregunto de dónde viene este alto costo. Ambas consultas parecen ser semánticamente equivalentes a mí.
+1 - Para elaborar, 'EXISTS' cortocircuitos y' OR' no (al menos en SQL Server, supongo que Oracle es similar). Al incluir el 'OR 'en el submenú' EXISTS' comprueba ambas opciones cada vez. Separar significa que solo verifica el segundo si el primero es falso. – JNK
+1 - Plan de ejecución 1: el filtro no existe (...) 1477315000 | Persona de acceso a la tabla por índice ROWID 13863 | Persona de acceso a la tabla por índice ROWID 4019; Plan 2 es enorme y utiliza dos combinaciones de hash – stracktracer
Aceptado como.Parece que sobreestimé el analizador de consultas de Oracle. – stracktracer