sql - keep - oracle delete duplicate rows group by
oracle delete consulta tomando demasiado tiempo (6)
¿Qué tan selectivo es ese índice? Si su tabla tiene un millón de filas y ese valor llega a ciento cincuenta mil de ellos, entonces su índice es inútil. De hecho, puede ser peor que inútil si realmente se está utilizando. Recuerde, una DELETE es como una instrucción SELECT: podemos ajustar su ruta de acceso.
Además, las eliminaciones ocupan una gran cantidad de deshacer tablespace, por lo que puede que esté sufriendo contiendas, si el sistema está experimentando un uso intensivo. En un sistema multiusuario, otra sesión puede tener un bloqueo en las filas que desea eliminar.
¿Tiene activadores ON DELETE? ¿Tiene restricciones de clave externa ON DELETE CASCADE?
Edición: dado todo lo que dice, y especialmente la columna en cuestión es la clave principal, por lo que está intentando eliminar una sola fila. Si lleva mucho tiempo, es mucho más probable que algún otro proceso o usuario tenga un bloqueo La fila. ¿Aparece algo en V$LOCK
?
Tengo una consulta como
DELETE from tablename where colname = value;
que lleva mucho tiempo para ejecutar. ¿Cuál podría ser la razón? Tengo un índice en colname.
¿Tu mesa tiene más cantidad de registros?
¿Hay algunos programas recursivos (algunos bucles anidados, etc.) ejecutándose en el servidor de la base de datos?
Compruebe los problemas de red si el servidor de base de datos está en diferentes máquinas?
Así que voy a publicar mi experiencia. Podría ser útil para alguien.
La consulta
delete from foo
where foo_id not in (
select max(foo_id) from foo group by foo_bar_id, foo_qux_id
);
tomó 16 seg. borrando 1700 registros del total de 2300 en la tabla foo
.
Revisé todos los índices de claves externas como se indica en otras respuestas. Eso no ayudó.
Solución:
Cambió la consulta a
delete from foo
where foo_id in (
select foo_id from foo
minus
select max(foo_id) from foo group by foo_bar_id, foo_qux_id
);
He cambiado not in
in
y he usado minus
para lograr el resultado correcto.
Ahora la consulta se ejecuta en 0.04 seg.
Es posible que su tabla esté relacionada con varias tablas que tengan un gran número de filas.
Podría haber varias explicaciones de por qué su consulta lleva mucho tiempo:
- Usted podría ser bloqueado por otra sesión (más probable). Antes de eliminar, debe asegurarse de que nadie más esté bloqueando las filas, por ejemplo: emitir
SELECT NULL FROM tablename WHERE colname=:value FOR UPDATE NOWAIT
, - Podría haber un
ON DELETE TRIGGER
queON DELETE TRIGGER
trabajo adicional, - Compruebe si hay
UNINDEXED REFERENCE CONSTRAINTS
apuntan a esta tabla (hay un script de AskTom que le ayudará a determinar si existen tales claves externas no indexadas).
Si algo es lento, y no sabes por qué, rastrealo y descúbrelo.
¿Cómo resuelvo los problemas de rendimiento con una declaración de Oracle SQL?