Chr*_*gna 11 sql-server-2008 sql-server t-sql
我需要更新单个表中的 1 亿条记录,实际上,通过用简单的 ID 替换列的 varchar 值来规范化表。(我说的是“替换”,但实际上我是将 ID 写入另一列。)
我想要实现的是规范化数据集。尚未标准化的数据没有索引。我的想法是我不会在原始值上构建索引,而是等待,而是索引将在更新完成后用 tinyint 值替换 varchar 值的外键。
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
Run Code Online (Sandbox Code Playgroud)
背景
执行期间的资源
我怀疑一些事情,比如我需要原始数据的索引,即使我会在规范化更新后删除列 (AutoClassName)。我还想知道我是否应该一次循环一条记录而不是 JOIN,这在我开始时看起来很荒谬,但现在看来会更快。
我应该如何更快地更改剩余标准化更新(类似于此更新)的方法?
JNK*_*JNK 10
我会采取不同的方法。
无需更新现有表,只需构建一个包含您所需内容的新表。
这几乎肯定会更快:
SELECT DISTINCT
AutoClassID,
<Other fields>
INTO
AutoDataImportStaging.dbo.Automobile
FROM
AutoData.dbo.AutoClass
Run Code Online (Sandbox Code Playgroud)
正如目前所写,有很多逻辑操作正在发生:
您正在尝试将其作为单个(非常大的)事务来执行。相反,以较小的批次进行更新。
您还将受益于:
小智 5
一次循环一排表格,不会更快!
正如您所怀疑和确认的那样,这将受到 I/O 限制——拥有一个磁盘,读取、写入、事务日志和(任何)临时工作空间都将竞争相同的 I/O。
简单恢复仍将记录事务,但日志将被检查点清除。您的初始日志大小和自动增长设置可能会导致一些 I/O 速度变慢 - 事务日志需要增长以适应更改。
您是否尝试过索引 AutoClassName 字段?有多少种不同的 AutoClass 值?
您可能需要根据 i/o 的限制批量更新。所以更新100万,检查点,重复......
归档时间: |
|
查看次数: |
4040 次 |
最近记录: |