0

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

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

  1. 从主表创建一个游标。
  2. 获取第一行
  3. 从 Counter 表中获取计数器
  4. 计数器++
  5. 调用 PROC 来计算结果、计数器等
  6. 使用 PROC 的结果更新主表
  7. 更新计数器表
  8. 获取另一行

但请相信我,大约 125 小时(没办法)太慢了。

有人可以帮助我吗?

4

1 回答 1

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;

它没有经过测试,请原谅任何语法错误或其他任何东西。

于 2013-01-24T13:58:34.823 回答