您的位置:首页 > 其它

删除千万级表中重复记录的办法

2008-10-18 02:25 211 查看
于前期的问题,在历史交易表中出现了部分重复交易,现在需要整理该表。

我一开始打算建一个临时表,用sqlserver odbc 导入导出数据的办法使用select distinct * 的语句将数据导入临时表,修改临时表名的办法,在实际操作过程中发现通过语句操作实际上需要将表中的记录先做select 然后写入临时表中,考虑到记录数和机器性能的问题,这种做法可行性不高。

交易表的基本情况是这样的:

每条记录约有60个字段,长度超过1k,

总共记录1000w,重复记录约在5000-10000

1. 选择候选键,60个字段,应该只用其中几个就可以判断重复了吧。

在候选键的这些字段上建立索引。

2.

CREATE TRIGGER tr_历史交易表

ON 历史交易表

FOR DELETE

AS

INSERT INTO 历史交易表

SELECT DISTINCT * FROM deleted

GO

DELETE 历史交易表

FROM (

SELECT 候选键1, 候选键2, 候选键3

FROM 历史交易表

GROUP BY 候选键1, 候选键2, 候选键3

HAVING COUNT(*) > 1

) t

INNER JOIN 历史交易表 a

ON t.候选键1 = a.候选键1

AND t.候选键2 = a.候选键2

AND t.候选键3 = a.候选键3

2.还可以是这样:

SELECT DISTINCT a.*

INTO #T

FROM (

SELECT 候选键1, 候选键2, 候选键3

FROM 历史交易表

GROUP BY 候选键1, 候选键2, 候选键3

HAVING COUNT(*) > 1

) t

INNER JOIN 历史交易表 a

ON t.候选键1 = a.候选键1

AND t.候选键2 = a.候选键2

AND t.候选键3 = a.候选键3

DELETE 历史交易表

FROM (

SELECT 候选键1, 候选键2, 候选键3

FROM 历史交易表

GROUP BY 候选键1, 候选键2, 候选键3

HAVING COUNT(*) > 1

) t

INNER JOIN 历史交易表 a

ON t.候选键1 = a.候选键1

AND t.候选键2 = a.候选键2

AND t.候选键3 = a.候选键3

INSERT INTO 历史交易表

SELECT * FROM #T
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: