【发布时间】:2014-01-17 05:32:15
【问题描述】:
防止在可能包含多达 5 亿行的 SQL 表中插入重复行的最有效方法是什么?
我看到了两种方式:
1) 在定义重复记录的列上创建复合主键并捕获 DuplicateKey 异常。
2) 使用IF NOT EXISTS(SELECT ID FROM TABLE WHERE [MyCondition]),但这需要索引那些参与WHERE 子句的列。
【问题讨论】:
防止在可能包含多达 5 亿行的 SQL 表中插入重复行的最有效方法是什么?
我看到了两种方式:
1) 在定义重复记录的列上创建复合主键并捕获 DuplicateKey 异常。
2) 使用IF NOT EXISTS(SELECT ID FROM TABLE WHERE [MyCondition]),但这需要索引那些参与WHERE 子句的列。
【问题讨论】:
唯一或主键。重复检查将在插入时完成。
如果您使用的是 SSIS,请在键上进行匹配查找并将重复项定向到医院表。
【讨论】:
ALTER TABLE MyTable ADD CONSTRAINT UC_MyConstraintName UNIQUE (col1,col2,col3)
【讨论】:
1) 比 2) 快,因为您只是使用已编译的 sql 代码复制 SQL Server 对机器代码所做的操作。
对于一些开箱即用的东西:如果插入性能比立即正确性更重要,那么首先忽略重复项。
您可以标记或单独记录未检查的行并运行计划任务以返回并重新检查它们。对于非常慢的读取选项,或者重复不是太大问题的情况,这可能是可以的。
如果您不需要立即在副本上写入失败,您可以使用服务代理异步执行重复检查,这将需要一些工作,但请从 here 开始。
【讨论】: