SQL Server与批量更新避免Cursor

时间:2013-01-24 11:27:55

标签: sql-server performance cursor updating

我有光标性能问题,我想避免。 我想解决的问题是: 使用由UDF计算的结果更新Main表中每条记录(大约6000000)(通过使用一个更新语句)的列(VARCHAR),UDF本身应该更新另一个Counter表中的计数器。
- 问题是UDF无法更新Countertable,因为它是副作用。 - 由于READONLY标志,它也无法更新临时表或变量表。 - 我在主表上使用了更新触发器,但是触发器通过一个存储在名为inserted的表中的单个更新语句触发了一次。

我选择的解决方案是使用Cursor,如下所示。

  1. 从主表创建游标。
  2. 获取第一行
  3. 从Counter表中获取计数器
  4. 计数器++
  5. 调用PROC来计算结果,计数器等
  6. 使用PROC的结果更新主表
  7. 更新计数器表
  8. 获取另一行
  9. 但是相信我,它在125小时内是太慢了(不可能)。

    那里有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我假设您的主表中有另一列标识该行,否则计数器没有多大意义。

你能尝试一下吗?如果我理解你的问题,那么既不需要函数也不需要游标。只是一个临时表,因为您无法同时读取和更新表。

INSERT INTO tmpTable
SELECT
yourPrimaryKey, sex, YEAR(dob) AS dobyear, ROW_NUMBER() OVER (PARTITION BY YEAR(dob) ORDER BY dob) AS counter
FROM
mainTable;

UPDATE mainTable
SET code = CONCAT(tmpTable.sex, tmpTable.dobyear, counter)
FROM
mainTable
INNER JOIN tmpTable
ON mainTable.yourPrimaryKey = tmpTable.yourPrimaryKey;

没有经过测试,可以原谅任何语法错误或其他原因。