レコードのペアを削除する、SQL DELETEステートメントを記述するための最良の方法

johanpm:

私はちょうど1テーブルとMySQLデータベースを持っている:フィールドは、次のとおりです。blocknr(一意ではない)、btcaddress(一意ではない)、TXID(一意ではない)、VIN、vinvoutnr、netvalue。

インデックスはbtcaddressとTXIDの両方に存在します。

その中のデータは、次のようになります。 ここでは、画像の説明を入力します。

私はすべて「削除可能」のレコードのペアを削除する必要があります。例は赤で示されています。条件は以下のとおりです。

  • TXIDは(同じTXIDを持つ2つの以上のレコードが可能)と同じでなければなりません

  • vinvoutnrは同じでなければなりません

  • VIN異なっていなければならないが(0、他の1でなければならないだけ2値の0と1を有することができるので、1でなければなりません)

36Mレコードのテーブルでは、およそ33Mのレコードが削除されます。

私はこれを使用しました:

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

それは動作しますが、5時間かかります。

たぶん、これはあまりにも(まだテストしていない)に動作します:

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

それとも私が削除クエリを忘れるとで、すべての非delatablesで新しいテーブルを作成し、元をドロップしようとしていますか?

データベースは、この削除クエリのためにオフラインにすることができます。

ゴードン・リノフ:

あなたの質問に基づいて、テーブル内のほとんどの行を削除しています。それは本当に高価です。より良いアプローチは、テーブルと再移入それを空にすることです:

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

truncate table registration;

insert into registration
    select *
    from temp_registration;

あなたのロジックは従うことが少し難しいですが、私は維持するために行のロジックがあると思います:

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
                 );

最高のパフォーマンスを得るために、あなたは上のインデックスをしたいですregistration(txid, vinvoutnr, vin)

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=395414&siteId=1