我有一个大表(大约40M行),其中我有一些0的列,需要为null,因此我们可以更好地键入数据。
我编写了脚本来查看将更新分成10000个记录的块,找到列的出现为零并将它们更新为null。
示例:
update FooTable
set order_id = case when order_id = 0 then null else order_id end,
person_id = case when person_id = 0 then null else person_id end
WHERE person_id = 0
OR order_id = 0
这很好用,但它永远都需要。
我认为更好的方法是创建第二个表并将数据插入其中,然后将其重命名为将旧表替换为零的列。
问题是 - 我可以从table1中选择一个插入表2并在进程中清理table1中的数据吗?
答案 0 :(得分:0)
您通常可以创建一个新的,已清理的表,具体取决于您使用的实际数据库服务器。
难的是,如果数据库中有其他表,则可能会出现外键,索引等问题,这些问题将引用原始表。
制作新的清洁表是否比更新现有表更快,只能通过尝试来解决。
答案 1 :(得分:0)
将要更新的所有记录的pk / clustered键转储到临时表中。然后执行更新加入临时表。这将确保最低的锁定级别和最快的访问。您还可以将标识列添加到临时表,而不是循环执行并批量执行更新。