我需要在表上更新大约250k行,并且每个要更新的字段将具有不同的值,具体取决于行本身(不是基于行id或键计算的,而是根据外部计算).
我尝试使用参数化查询,但事实证明它很慢(我仍然可以在SQL Server 2008中尝试使用表值参数SqlDbType.Structured,但我想在一些数据库上有一个通用的方法包括MySql,Oracle和Firebird).
制作大量的个人更新也很慢(比使用参数化查询进行数千次单独调用(往返!)快2倍)
如何创建临时表并运行加入我的表和tmp的更新?会更快吗?
慢"慢"有多慢?
这样做的主要问题是它会在数据库的日志文件中创建一个巨大的条目(如果在更新过程中出现电源故障,数据库需要记录每个操作,以便在发生故障时可以回滚) .这很可能是"缓慢"的来源,而不是其他任何东西(尽管显然有如此多的行,还有其他方法可以使事情效率低下[例如,每次更新一次DB往返会非常缓慢] ,我只是说,一旦你消除了明显的事情,你仍然会发现它很慢).
有几种方法可以更有效地完成它.比如,一个是以块的形式进行更新,一次1000行.这样,数据库就会写出许多小的日志条目,而不是一个非常庞大的日志条目.
另一种方法是关闭 - 或者"关闭" - 数据库在更新期间的日志记录.例如,在SQL Server中,您可以将恢复模型设置为"简单"或"批量更新",这会大大加快速度(如果出现电源故障或更新期间出现问题,则需要注意的是风险更大).
编辑只是为了扩展一点,最初实际执行查询的最有效方法可能是将所有新行的BULK INSERT放入临时表中,然后UPDATE从中执行单个现有表(或者UPDATE像我上面所说的那样以1000块为单位).我的大多数答案都是在你实现它之后解决这个问题:你仍然会发现它很慢......