0

60 000 000 レコードを含む大規模な SQL 2008 テーブルで、行の重複に問題があります。

このコマンドにより、 http://support.microsoft.com/kb/139444から取得した複製が得られます

SELECT     id, sa_trvalue,  COUNT(*) AS tot  
FROM         msanal   
GROUP BY id, sa_trvalue  
HAVING      (COUNT(*) > 1)  

しかし、手順 (INTO および DISTINCT) を実行すると、操作を完了するのに十分なメモリが得られません。

4

2 に答える 2

1

必要なメモリが少ない可能性があるこのアプローチを試すことができます。

WITH CTE AS
(
    SELECT  id, sa_trvalue, 
            rn = ROW_NUMBER() OVER (PARTITION BY id, sa_trvalue ORDER BY id ASC)
    FROM    msanal   
)
DELETE FROM CTE WHERE rn > 1

共通テーブル式には、何を削除するかを確認するために簡単に変更できるという利点もあります。したがって、に変更DELETEするだけSELECT *です。

于 2013-10-01T15:45:12.020 に答える