1

テーブルから重複する値を削除する次の SQL があります。

DELETE p1 
FROM `ProgramsList` p1, `ProgramsList` p2  
WHERE p1.CustId = p2.CustId 
    AND p1.CustId = 1 
    AND p1.`Id`>p2.`Id` 
    AND p1.`ProgramName` = p2.`ProgramName`;

Id
特定の自動増分はCustId ProgramName一意である必要があります (現在はそうではありません)
上記の SQL は、約 1,000,000 レコードで完了するのに約 4 ~ 5 時間かかります

テーブルから重複を削除するより迅速な方法を提案できる人はいますか?

4

2 に答える 2

1

最初に、ProgramName フィールドと CustID フィールドにインデックスを追加してみてください (まだ持っていない場合)。

重複除外

重複を識別するためにレコードをグループ化できます。その際、各グループの最小 ID 値を取得します。次に、ID が MinID のものではないすべてのレコードを削除します。

節内法

delete from
 ProgramsList
where
 id not in 
    (select min(id) as MinID
      from ProgramsList
      group by ProgramName, CustID) 

結合方法

グループごとに多くのメンバーがいる場合は、これを複数回実行する必要がある場合があります。

DELETE P
FROM ProgramsList as P
INNER JOIN 
    (select count(*) as Count, max(id) as MaxID
     from ProgramsList
     group by ProgramName, CustID) as A on A.MaxID = P.id
WHERE A.Count >= 2

In-Clause でパフォーマンスの問題を抱えている人もいれば、そうでない人もいます。インデックスなどに大きく依存します。一方が遅すぎる場合は、もう一方を試してください。

関連: https://stackoverflow.com/a/4192849/127880

于 2013-02-11T16:58:45.627 に答える