我需要检查数据库中table1中是否存在特定数据,或者是否存在for循环中。如果它存在则没有动作和for循环继续,否则我应该向table1添加数据。
所以,在每次迭代中,我都会看一下数据库。我相信这很耗时。
执行此类任务是否有最佳做法?
答案 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万次(可能已记录)操作,每行一次将获得比例如更长的数量级的订单: