【问题标题】:Bulk update huge table批量更新大表
【发布时间】:2011-08-31 20:17:33
【问题描述】:

我有一个包含 26 列和几千条记录的表。 有没有办法批量更新这个表?

现在我只是对需要更新的每一列进行标准更新。 例如

update mytbl
set col1 = replace(....)

update mytbl
set col1 = col1 + "xyz"

update mytbl
set col2 = "test..."

我知道,对于每条记录,上述语句将首先更新所有记录的列,然后再转到下一列。

我正在寻找“快速批量更新”,因为这花费的时间太长。

谢谢

【问题讨论】:

  • 每列更改的标准是否不同?例如,仅在 x 是星期二时更新 column1,在 y 时才更新 column2.. 还是所有列的标准都相同?

标签: sql sql-server sql-update bulk


【解决方案1】:

你可以使用这个结构:

UPDATE myTable
SET col1 = REPLACE(col1.....),
    col2 = 'some value'

【讨论】:

  • 这个可以实现吗:update myTable set col1 = replace(col1...), col1 = col1 + "some value"
  • 在 ck 建议的多列更新中尝试多次更新 col1 时返回错误。在同一 SET 子句中不能为列分配多个值。
  • @Ernesto - 您可以发布您的 SQL(编辑您的问题以添加它)和完整的错误消息。这将有助于找到问题。
  • @Ernesto - 如果您想多次更新一列,您必须在一个语句中完成所有操作:SET col1 = replace(col1...) + 'some value' .. any other operations ...
【解决方案2】:

1 - 几千条记录 x 26 个字段并不大 :)

2 - 使用 ck 建议的多字段更新语法,或者将其插入可能更快的新表中:

SELECT (REPLACE(col1...)) as Col1,
       'Some Value' as Col2,
       ...
INTO MyNewTable
FROM MyOldTable

【讨论】:

  • 至少 600 000 条记录。我对一列进行多次更新,直到数据采用所需的格式。例如。 urlcol 可能具有值test.com/tess/1234/zap.php 然后我进行更新以删除 http:// 部分然后另一个更新以删除 .com 之后的任何内容导致 urlcol 然后是 www.test.com 其他一些列我只能从其他信息更新列
  • 正如您所提到的,该操作将在 1 个表上执行。这意味着查询不会有任何连接。然后别担心。 JNK - "INTO MyNewTable" 我认为,我们可以直接在目标表上执行更新语句而不引入第二个表?
  • 我对大约 120 万条记录进行了测试,用时 19 分钟完成。
  • 您是否尝试禁用索引?然后开始你的测试并在之后恢复
  • @Ernesto - 根据您的 cmets,听起来您正在对 URL 和其他字符串执行多值逻辑。尝试将其放入 UDF 并使用新值中的 UDF 运行更新
【解决方案3】:

这些建议对于更多的记录更有用,但无论如何可能会有所帮助: 1.按照ck的建议使用多字段更新

  1. 如果可以在更新期间锁定表以进行独占访问。

  2. 禁用所有索引。更新完成后恢复它们。

【讨论】:

    【解决方案4】:

    请注意以下几点。

    1. 您可以使用 SQL Profiler 检查在更新过程中是否有任何触发器在做某事。

    2. 您可以禁用索引。现在运行您的测试并最终恢复它。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 2020-06-03
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多