Mejor manera de escribir SQL instrucción de eliminación, la eliminación de pares de registros

johanpm:

Tengo una base de datos MySQL con sólo 1 mesa: Los campos son: blocknr (no el único), btcaddress (no el único), txid (no el único), vin, vinvoutnr, Netvalue.

existen índices en tanto btcaddress y txid.

Los datos en que se ve así: introducir descripción de la imagen aquí

Tengo que eliminar todos los pares de registros "eliminables". Se da un ejemplo en rojo. Las condiciones son:

  • TxID debe ser el mismo (no puede haber más de 2 registros con mismo TxID)

  • vinvoutnr debe ser el mismo

  • vin debe ser diferente (sólo puede tener 2 valores 0 y 1, por lo que 1 debe ser 0 otro debe ser 1)

En una tabla de registros 36M, 33M acerca de los registros serán eliminados.

He utilizado este:

delete t1 
from registration t1 
inner join registration t2 
where t1.txid=t2.txid and t1.vinvoutnr=t2.vinvoutnr and t1.vin<>t2.vin;

Funciona, pero tarda 5 horas.

Tal vez esto funcionaría también (no determinado todavía):

delete t1 
from registration as t1, registration as t2 
where t1.txid=t2.txid and t1.vinvoutnr=t2.vinvoutnr and t1.vin<>t2.vin;

¿O me olvido de una consulta de eliminación y tratar de hacer una nueva tabla con todos los no delatables y luego caer en el original?

Base de datos puede estar fuera de línea para esta consulta de eliminación.

Gordon Linoff:

Sobre la base de su pregunta, que va a eliminar la mayor parte de las filas de la tabla. Eso es sólo muy caro. Un mejor enfoque es vaciar la tabla y volver a llenarla:

create table temp_registration as
    <query for the rows to keep here>;

truncate table registration;

insert into registration
    select *
    from temp_registration;

Su lógica es un poco difícil de seguir, pero creo que la lógica en las filas guardar es:

select r.*
from registration r
where not exists (select 1
                  from registration r2
                  where r2.txid = r.txid and
                        r2.vinvoutnr = r.vinvoutnr and
                        r2.vin <> r.vin
                 );

Para un mejor rendimiento, desea un índice en registration(txid, vinvoutnr, vin).

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=395418&siteId=1
Recomendado
Clasificación