5
在100mm记录上使用JOIN进行更新,如何做得更好?(在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) 背景 在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,这在我开始时似乎很荒谬,但现在看来它会更快。 如何为剩余的规范化更新(类似于此方法)更快地更改方法?