如何在SQL Server 2005中有效地操作500k记录?

cde*_*zaq 0 timeout sql-server-2005

我从客户那里获得了一个包含500,000个用户更新的更新信息的大文本文件.但是,当我处理此文件时,我经常遇到SQL Server超时错误.

这是我在VB应用程序中遵循的处理数据的过程(通常):

  1. 从临时表中删除所有记录(删除上个月的数据)(例如DELETE * FROM tempTable)
  2. 将文本文件翻录到临时表中
  3. 在临时表中填写额外信息,例如organization_id,user_id,group_code等.
  4. 根据临时表中计算的数据更新实际表中的数据

问题是我经常运行像UPDATE tempTable SET user_id = (SELECT user_id FROM myUsers WHERE external_id = tempTable.external_id这样的命令,这些命令经常超时.我已经尝试将时间超过10分钟,但它们仍然失败.现在,我意识到500k行是不容易操作的行数,但我认为据称能够处理数百万行的数据库应该能够很容易地处理500k.我是如何处理这些数据的?

请帮忙.任何和所有建议欢迎.

KM.*_*KM. 5

像你在问题中给我们的子查询:

UPDATE tempTable SET user_id = (SELECT user_id FROM myUsers WHERE external_id = tempTable.external_id) 
Run Code Online (Sandbox Code Playgroud)

一次只有一行好,所以你必须循环.思考集基于:

UPDATE t
    SET user_id = u.user_id
    FROM tempTable          t
        inner join myUsers  u ON t.external_id=u.external_id
Run Code Online (Sandbox Code Playgroud)

并删除你的循环,这将更新一个语句中的所有行,并显着更快!

  • @cdeszaq:你的查询它就像一个forloop,因为它有一个为tempTable中的每一行运行的子查询. (2认同)