编写代码来处理25,000条记录C#,T-SQL,快速性能是关键

循环通过25,000条记录的最有效方法是什么,并且基于一些不会改变的预先编写的vb逻辑(99%肯定),将表中的Result列更新为值1,2或3? 性能和可靠性在这里是最重要的。这很可能会通过网络上的客户端服务器应用程序调用,但能够从Web应用程序调用它会很好。我正在考虑用T-SQL,C#做3种不同的方法。 一个。编写执行存储过程的对象获取25,000条记录,使用foreach集合遍历每条记录,并基于某些c#逻辑,在执行存储过程的每条记录上调用一个对象来更新该行。这会将对象调用25,000次(我假设proc只会重用执行计划) 要么 湾编写一个获取25,000条记录的存储过程,使用禁止的游标遍历每条记录,并根据某些T-SQL逻辑,更新该存储过程中的该行。 要么 更新:我的解决方案就是这个 为了它的价值,我将使用持久的计算列,并将循环分解为更小的更新语句以更新列(所有包装在事务中)。见下文。我认为与循环相比它会非常快。 http://technet.microsoft.com/en-us/library/cc917696.aspx     
已邀请:
你显然有一些条件确定值应该是1,2或3.你可以只做3个更新查询。每个查询都会根据确定值是1,2或3的条件更新记录。如果可以提供帮助,请不要将所有数据下载到您的计算机上。     
如果可能的话,我的第一选择是在SQL中完成所有操作,即更新xxx set col = 1 where(你的逻辑在这里),更新xxx set col = 2 where(logic)等。 如果您需要在Web应用程序或客户端服务器中执行vb客户端中的逻辑,我的选择是使用datareader来传递记录(仅下拉所需的列,而不是整行)和执行TSQL更新或存储过程以执行调用以更新那些需要更新的记录,一次一个。 datareader将为您提供最佳性能; SP应该至少与TSQL更新一样好(但可能不是很多)。 编辑:避免服务器端游标(几乎)任何成本...他们是真正的生猪。     
如果性能是关键,那么在不输入c#的情况下解决此问题实际上是最佳选择。 在c#之外运行查询。 如果真的有必要使用DataReaders。     
我不会选择B.我使用游标的经验非常慢。 C.使用DataReader并使用ExecuteNonQuery更新记录     
如何选择(C)使用基于集合的逻辑而不是游标更新表的存储过程:
...
update x set col = f(x)
from   x
...
    
根据更新的工作方式,您有几个选项。 有一个计算列,其中结果是持久的。这样,当记录改变时,它将在一个地方更新。 而不是运行25,000个更新查询,只需使用sqlbulk加载。 (这是我的偏好)。让您的应用程序将参数发送到SQL Server以更新内容。在这种情况下,我倾向于使用静态游标,因为它会更快一点,只要一条记录不一定影响下一条记录。     
你可以: 使用3个单独的UPDATE @Andrew建议 将记录拉入临时记录 表和循环通过它们 一批可能有1000条记录 UPDATE的WHILE循环中的时间 声明(所以,25循环/ UPDATE) 或者,如果您使用的是SQL Server 2008 (或更新)和算法 确定变化是复杂的,你 可以把25,000行拉成一个 .Net方面的集合和 将更改流回到Proc 具有表值参数 并做一次更新。您可以在以下位置找到此示例: http://www.sqlservercentral.com/articles/SQL+Server+2008/66554/ 在每种情况下,您都希望避免25,000次UPDATE调用。     
我有类似的情况。实际上,我有> 10,000,000条记录。业务逻辑相当复杂,并且存在纯粹用SQL编写的旧代码。经理告诉我,使用旧代码,每1000,000条记录需要15个小时以上。凭借我的解决方案,我只花了5分钟,真的!我在循环中做了这个,迭代中有3个步骤,每次迭代都有一批记录: 批量加载发票。我不记得批量大小,我认为它只有几千。 在加载的记录上执行业务逻辑 批量插入。因为它很大,所以无法更新。因此它被批量放入临时表,与原始表几乎相同的结构,然后在原始表中按键更新。每次批量插入时都会清空/删除临时表。它比标准更新快得多。     

要回复问题请先登录注册