在循环中检查数据库中数据是否存在的最佳实践?

时间:2011-01-27 07:52:04

标签: .net database loops insertion

我需要检查数据库中table1中是否存在特定数据,或者是否存在for循环中。如果它存在则没有动作和for循环继续,否则我应该向table1添加数据。

所以,在每次迭代中,我都会看一下数据库。我相信这很耗时。

执行此类任务是否有最佳做法?

2 个答案:

答案 0 :(得分:1)

如何验证数据库表中是否存在记录?很可能你将它与本地Id或其他东西相匹配。

如果这是真的,那么我将查询表并选择所有Id,将它们存储在Hashtable(.Net中的Dictionary)中。 (如果您的数据库包含数百万条记录,这可能不实用)。确定表中的记录现在是否存在是一个简单的问题,即检查字典中的键是否存在,这是一个O(log n)操作,因此比O(n)昂贵的数据库往返更好。

接下来要考虑的是如何记住需要添加到表中的记录。这取决于您是否可能在本地具有要检查是否应添加的重复记录,或者是否保证不包含(本地)重复记录。

在没有可能重复的简单情况下,只需在相应的键上将它们添加到Dictionary中,然后稍后查询Dictionary.Values即O(1)可能就像它获得的那样快。如果您需要插件非常快,因为它们很大,请考虑使用SQL批量插入。

如果你的表太大而无法在本地缓存Id,我会考虑实现一个用于执行插入的存储过程,并具有决定是否实际执行插入的逻辑,或者只是在那里做任何事情。这将摆脱第二次往返,这通常非常昂贵。

如果您的RDBMS实现了SQL Merge命令(假设您正在使用MS SQL Server),我会将所有数据插入临时表中,然后将其与目标表合并。这可能是最快的解决方案。

答案 1 :(得分:0)

这里有多少数据和SQL实现可以产生很大的不同......

例如,拥有1000万行数据,进行1000万次(可能已记录)操作,每行一次将获得比例如更长的数量级的订单:

  • 在批量操作中将相同数据上载到临时表格,例如通过批量复制API,如果您使用的是SQL。
  • 执行left-outer-join以区分数据
  • 在单个批处理操作中插入差异。