实际上,我需要更新单个表中的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)
背景
- 在Server 2008 R2上使用MSSQL 2008 R2
- 服务器有8 GB RAM
- 服务器具有一个RAID10和7200 RPM SATA(我知道这不是很好,在生产中,它只能读取数据,而不能写入数据;加上最近的HD短缺使得这成为必需的成本)
- 服务器具有双四核Xeon CPU
- 机器没有做任何其他事情(当前专用于开发人员,仅此过程)
- 打开了简单的日志记录(?-但是它仍会记录下来以便可以回滚吗?)
- 请注意,该查询引用了两个不同的数据库,因此值得
- 表中要更新的记录的“宽度”为455字节
执行期间的资源
- 物理RAM已用完
- 磁盘I / O已用尽
- CPU几乎什么也没做(扼要点是I / O)
- 运行时间已经有14个小时了!
我怀疑有些事情,例如我需要在原始数据上建立索引,即使在规范化更新后将删除列(AutoClassName)时也是如此。我还想知道是否应该一次循环遍历一个表而不是JOIN,这在我开始时似乎很荒谬,但现在看来它会更快。
如何为剩余的规范化更新(类似于此方法)更快地更改方法?
TOP
子句进行批量更新。那就是我的方法。