我需要保存一批对象。
性能缓慢(15分钟内保存了15万个对象)是由于检查。
检查每个对象 - 某些字段的聚合应该是唯一的。
所以问题是:
答案 0 :(得分:0)
假设您当前正在逐行检查,并且在更新期间锁定表不是问题,我猜您在这里尝试做一个特殊的UPSERT(如果已经有匹配的行会发生什么情况) ?你是中止这个过程,还是跳过这一行,还是其他什么东西?)
在SQL Server 2008中,您可能正在寻找MERGE
语句。
在SQL Server 2005及更早版本中,您可以使用LEFT JOIN
执行类似操作(联接表中的键列为空)
更新(d两次):根据您的反馈,我们假设您正在使用SQL Server 2005并希望基于复合(多列)键添加新行,同时避免(并可能警告)现有/重复的行。
你有一个表“Table1”,其中包含一些数据:
KeyCol1 KeyCol2 ValueCol
1 2 Test
3 2 MoreTest
4 2 TestForever
您有一个包含要加载的数据的临时表(或表变量,或加载/登台表或其他内容):
KeyCol1 KeyCol2 ValueCol
2 2 OKValue
5 2 AlsoOK
4 2 ProblemValue
您执行内部联接以获取任何“已存在”的行(然后引发错误,或对问题条目列表执行任何操作):
SELECT FinalTable.*
INTO #ProblemRecords
FROM FinalTable
INNER JOIN TempTable ON FinalTable.KeyCol1 = TempTable.KeyCol1
AND FinalTable.KeyCol2 = TempTable.KeyCol2
--Could add group by here if it's possible to have more than one record per join key
左边连接用于插入不在最终表格中具有已匹配记录的记录:
INSERT INTO FinalTable (KeyCol1, KeyCol2, ValueCol)
SELECT TempTable.KeyCol1, TempTable.KeyCol2, TempTable.ValueCol)
FROM TempTable
LEFT JOIN FinalTable ON FinalTable.KeyCol1 = TempTable.KeyCol1
AND FinalTable.KeyCol2 = TempTable.KeyCol2
WHERE FinalTable.KeyCol1 Is Null
关于这种方法的一些注意事项:
BULK INSERT
,bcp
,SQLXML
,SSIS /导入 - 导出向导等等。