Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写代码来处理25000条记录C#,T-SQL,快速性能是关键_C#_Tsql_Loops - Fatal编程技术网

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

编写代码来处理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只会重用执

循环25000条记录的最有效方法是什么?基于一些永远不会改变的预写vb逻辑(99%确定),将表中的结果列更新为1、2或3

性能和可靠性在这里是最重要的。这很可能会通过网络上的客户端服务器应用程序调用,但如果能够从web应用程序调用它,那就太好了。我正在考虑使用T-SQL、C#三种不同的方法

a。编写一个执行存储过程的对象获取25000条记录,使用foreach集合遍历每个记录,并基于一些c#逻辑,在每个记录处调用一个执行存储过程的对象来更新该行。这将调用对象25000次(我假设proc只会重用执行计划)

b。编写一个获取25000条记录的存储过程,使用禁止的光标遍历每条记录,并基于一些T-SQL逻辑,更新此存储过程中的该行

更新:我的解决方案是 值得一提的是,我将使用persited计算列,并将循环分解为更小的update语句来更新列(全部打包在一个事务中)。见下文。我认为这将是非常快的,相比一个循环


很明显,您有一些条件决定值应该是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个更新查询,只需使用sqlbulkload即可

  • (这是我的偏好)。让您的应用程序向SQL server发送要更新的参数。在这种情况下,我倾向于使用静态游标,因为它会快一点,只要一条记录不一定影响下一条记录

  • 您可以:

  • 使用3个单独的更新 由@Andrew建议

  • 将记录拖到临时文件夹中 表并在其中循环 一次大概有1000条记录 更新的WHILE循环中的时间 声明(因此,25次循环/更新)

  • 或者,如果您使用的是SQL Server 2008 (或更新版本)以及 确定更改是复杂的,您可以 可以将25000行拉入一个 Net端的集合和 将更改流回进程 具有表值参数的 并进行一次更新。您可以在以下网址找到此示例:


  • 在每种情况下,您都希望避免25000次更新呼叫。

    我也有类似的情况。事实上,我有超过10000条记录。业务逻辑相当复杂,而且有纯用SQL编写的旧代码。经理告诉我,使用旧代码,每1000.000条记录需要15个以上小时。用我的解决方案,我只花了5分钟,真的!我在循环中完成了这项工作,在迭代中有3个步骤,每个迭代都有一批记录:

  • 大批发票。我不记得批量大小了,我想大概是几千
  • 对加载的记录执行业务逻辑
  • 批量插入。因为它是大容量的,所以无法更新。所以它被批量放入临时表中,其结构和原始表几乎相同,然后在原始表中按键进行更新。每次大容量插入都会清空/删除临时表。它比标准更新快得多

  • 需要在每行上运行的代码是什么?我们可以完全取消迭代方法。这-再加上一个触发器,在每一行上自动计算,这样你就不必再这样做了。在我看来,调用存储过程并循环每个记录要比在客户端上写入处理过程并不断从客户端到客户端来回快数据库服务器每次更新记录。是/否??为什么要在SQL中“循环遍历每条记录”。SQL是关于集合和基于集合的处理的。update语句更新0、1或500000行或where子句返回的行数。执行存储过程。它完成了它的工作,直到完成才回来。在一个配置正确的SQL Server上进行25000行更新甚至不会让SQL Server喘不过气来,更不用说让它流汗了。完全正确。。12年前,当我还是一名新手的时候,我写了最初的代码,从那以后我学到了很多东西..最终使用了persited计算列和ol where子句以及封装在事务中的几个不同查询。。