代码之家  ›  专栏  ›  技术社区  ›  cdeszaq Sudhir N

如何有效地操作SQL Server 2005中的500000条记录?

  •  0
  • cdeszaq Sudhir N  · 技术社区  · 14 年前

    我从一个客户那里得到一个更新信息的大文本文件,其中包含500000个用户的更新。但是,在处理此文件时,我经常遇到SQL Server超时错误。

    下面是我在VB应用程序中处理数据的过程(一般来说):

    1. 从临时表中删除所有记录(删除上个月的数据)(例如 DELETE * FROM tempTable )
    2. 将文本文件翻录到临时表中
    3. 在临时表中填写额外的信息,例如他们的组织ID、用户ID、组代码等。
    4. 根据临时表中计算的数据更新实际表中的数据

    问题是我经常运行如下命令 UPDATE tempTable SET user_id = (SELECT user_id FROM myUsers WHERE external_id = tempTable.external_id )这些命令经常超时。我试过把超时时间缩短到10分钟,但还是失败了。现在,我意识到500K行并不是要处理的少量行,但是我认为一个声称能够处理数百万行的数据库应该能够很容易地处理500K。我处理这些数据的方式有问题吗?

    请帮忙。欢迎提出任何建议。

    6 回复  |  直到 14 年前
        1
  •  5
  •   KM.    14 年前

    类似于您在问题中给出的子查询:

    UPDATE tempTable SET user_id = (SELECT user_id FROM myUsers WHERE external_id = tempTable.external_id) 
    

    一次只能在一行上运行,所以必须循环运行。基于思维集:

    UPDATE t
        SET user_id = u.user_id
        FROM tempTable          t
            inner join myUsers  u ON t.external_id=u.external_id
    

    并删除循环,这将更新一条语句中的所有行,并且速度显著加快!

        2
  •  1
  •   TomTom    14 年前

    需要更多信息。我经常在一个1.5亿行表中操作300-400万行,我不认为这是很多数据。我有一个“产品”表,包含大约800万个条目-包括全文搜索。也没有问题。

    你能把你的硬件加工一下吗?我假设“普通台式PC”或“低端服务器”,两者都具有绝对非最佳的磁盘布局,因此在更新时会出现大量IO问题。

        3
  •  1
  •   TLiebe    14 年前

    确保在执行选择的表上有索引。在示例更新命令中,从myusers表中选择用户\u id。在myusers表上是否有带有user_id列的索引?索引的缺点是增加了插入/更新的时间。确保您没有要更新的表上的索引。如果要更新的表确实有索引,请考虑删除它们,然后在导入后重新构建它们。

    最后,在SQL Server Management Studio中运行查询,并查看执行计划以了解查询的执行情况。寻找像表扫描之类的东西,看看您可以在哪里进行优化。

        4
  •  1
  •   user132371    14 年前

    看看KM的答案,不要忘记索引和主键。

        5
  •  1
  •   dan    14 年前

    导入数据后是否为临时表编制索引?

    temp_table.external_id 应该有一个索引,因为它在 where 条款。

        6
  •  -1
  •   Yes - that Jake.    14 年前

    导入大数据块有更有效的方法。在BCP(批量复制协议)下的SQL联机丛书中查找。