编写代码来处理25000条记录C#,T-SQL,快速性能是关键
循环25000条记录的最有效方法是什么?基于一些永远不会改变的预写vb逻辑(99%确定),将表中的结果列更新为1、2或3 性能和可靠性在这里是最重要的。这很可能会通过网络上的客户端服务器应用程序调用,但如果能够从web应用程序调用它,那就太好了。我正在考虑使用T-SQL、C#三种不同的方法 a。编写一个执行存储过程的对象获取25000条记录,使用foreach集合遍历每个记录,并基于一些c#逻辑,在每个记录处调用一个执行存储过程的对象来更新该行。这将调用对象25000次(我假设proc只会重用执行计划) 或 b。编写一个获取25000条记录的存储过程,使用禁止的光标遍历每条记录,并基于一些T-SQL逻辑,更新此存储过程中的该行 或 更新:我的解决方案是 值得一提的是,我将使用persited计算列,并将循环分解为更小的update语句来更新列(全部打包在一个事务中)。见下文。我认为这将是非常快的,相比一个循环编写代码来处理25000条记录C#,T-SQL,快速性能是关键,c#,tsql,loops,C#,Tsql,Loops,循环25000条记录的最有效方法是什么?基于一些永远不会改变的预写vb逻辑(99%确定),将表中的结果列更新为1、2或3 性能和可靠性在这里是最重要的。这很可能会通过网络上的客户端服务器应用程序调用,但如果能够从web应用程序调用它,那就太好了。我正在考虑使用T-SQL、C#三种不同的方法 a。编写一个执行存储过程的对象获取25000条记录,使用foreach集合遍历每个记录,并基于一些c#逻辑,在每个记录处调用一个执行存储过程的对象来更新该行。这将调用对象25000次(我假设proc只会重用执
很明显,您有一些条件决定值应该是1、2还是3。您可以只执行3个更新查询。每个查询都会根据确定值是1、2还是3的条件更新记录。如果可以的话,不要把所有的数据都拖到你的机器上。如果可以的话,我的第一选择是用SQL来完成,即更新xxx set col=1 where(这里是你的逻辑),更新xxx set col=2 where(逻辑)等等 如果您需要在vb客户机中执行逻辑,无论是在web应用程序还是客户机服务器中,我的选择是使用datareader来传递记录(只下拉所需的列,而不是整行),然后执行TSQL更新或存储过程来调用以更新需要更新的记录,一次一个) datareader将为您提供最佳性能;SP的性能应该至少与TSQL更新一样好(但可能不会太好)
编辑:不惜(几乎)任何代价避免使用服务器端游标…它们是真正的猪。我不会选择选项B。根据我的经验,使用游标非常慢 C.使用a并使用更新记录选项(C)使用基于集合的逻辑而不是光标更新表的存储过程如何:
...
update x set col = f(x)
from x
...
如果性能是关键,那么在不输入c#的情况下解决这个问题实际上是最好的选择。 在c#之外运行查询。
如果确实有必要,请使用DataReader。根据更新的工作方式,您有几个选项
在每种情况下,您都希望避免25000次更新呼叫。我也有类似的情况。事实上,我有超过10000条记录。业务逻辑相当复杂,而且有纯用SQL编写的旧代码。经理告诉我,使用旧代码,每1000.000条记录需要15个以上小时。用我的解决方案,我只花了5分钟,真的!我在循环中完成了这项工作,在迭代中有3个步骤,每个迭代都有一批记录:
需要在每行上运行的代码是什么?我们可以完全取消迭代方法。这-再加上一个触发器,在每一行上自动计算,这样你就不必再这样做了。在我看来,调用存储过程并循环每个记录要比在客户端上写入处理过程并不断从客户端到客户端来回快数据库服务器每次更新记录。是/否??为什么要在SQL中“循环遍历每条记录”。SQL是关于集合和基于集合的处理的。update语句更新0、1或500000行或where子句返回的行数。执行存储过程。它完成了它的工作,直到完成才回来。在一个配置正确的SQL Server上进行25000行更新甚至不会让SQL Server喘不过气来,更不用说让它流汗了。完全正确。。12年前,当我还是一名新手的时候,我写了最初的代码,从那以后我学到了很多东西..最终使用了persited计算列和ol where子句以及封装在事务中的几个不同查询。。