Cursor与30000记录之间的性能考虑或创建30000更新语句

时间:2013-01-16 07:39:21

标签: sql sql-server performance sql-server-2008 cursor

哪个更好?

1)循环30000记录并逐个执行更新的游标

2)创建一个具有30000更新命令的脚本

感谢

3 个答案:

答案 0 :(得分:2)

两者都应该花费大约相同的时间,主要取决于如何声明CURSOR。

原因?您有30,000个个人更新,这通常是主要因素

请注意,由于批量大小和编译时间,一批中30,000个单独的UPDATE可能会失败...

SQL是一种基于集合的语言,您很可能只需一次UPDATE即可一次性更新所有行。如果你不能,那是因为2个原因

  1. 你需要"每行"逻辑:这通常可以通过CASE表达式,UDF等实现
  2. 您不了解集合和SQL
  3. 有了更多信息(SQL和逻辑),我们可以为您提供更多帮助......

答案 1 :(得分:0)

有一种非常简单的方法可以说:做它并测量时间。

除此之外,当你只有10只时,拥有30000行并没有多大意义。

出于数据迁移或维护之外的其他原因进行更新也不是明智之举,在这些情况下,性能不是问题 - 但维护和易读性总是如此。

答案 2 :(得分:0)

你知道,这取决于背景。

但是,这有助于学习。以SQL为例。您处于较低的水平,不能在此处看到真正的优化。 SQL不仅仅是Update,Insert和简单的Select语句。

  

1)循环30000记录并逐个执行更新的游标

线性逐步处理。无法进行并列化,因为SQL本身没有可供用户使用的线程机制;优化是逐个进行的 - 即查询优化器一次查看一个语句。

  

2)创建一个具有30000更新命令的脚本

假设脚本是外部的,它可以拆分工作并在多个连接上并发运行,即运行多个并行。

但还有更多:

  • 制作一个计算新值的脚本。
  • 使用buld copy API
  • 批量导入它们到临时表中
  • 发出一个更新语句,将更新的值从临时表转移到最后一个。

也许有一个脚本为多次更新发出合并声明?如果您知道SQL api而不是“更新,打开游标,简单选择”,那么有很多变化。

我这样做 - 虽然有更多数据(批次为50.000,有时同时为4-6)。问题是sql批量复制有一些开销。但我这样每秒管理75.000次插入。

很大程度上取决于业务问题和逻辑的复杂性 - 如果它是简单的更新,那么问题是:计算或外部驱动?多个值乘以2 =计算,更新地址=数据驱动(即您需要来自某处的新数据)。