我一开始打算建一个临时表,用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