我正在尝试更新一个大表,我被告知将创建表作为(选择)要快得多。例如,如果您想将1000万记录表中的Field1更新为UPPER,那么(显然)可以更快地完成
Create TableANew as (Select UPPER(Field1),Field2,FieldN from TableA);
Drop Table TableA;
Rename Table TableANew to TableA
假设这是真的,那么如何更新字段需要作为连接完成?换句话说,如果我原来的计划是:
Update TableA as T1
Inner Join TableB as T2
On T1.Product=T2.Product
Set T1.ProductID=T2.ProductID
如何将更新合并到创建表中(从表中选择)结构?为了清楚起见,我使用了一个非常基本的Create Table as Select来显示该查询的结构,因为我理解它;我实际上需要一个创建表作为选择(字段,字段,连接)并且不清楚如何在第一个答案的上下文中设置它,虽然提供表的重命名的改进但是没有解决如何/如果我可以在Create as Select
中进行连接答案 0 :(得分:0)
我错过了join
update
正在做的事情。这两种方法是:
update tableA
set a.field1 = upper(a.field1);
与
create table temp_tableA as
select upper(a.field1) as field1, field2, field3
from tableA;
-- check, check, check that the data is right
truncate table tableA;
insert into tableA(field1, field2, field3)
select field1, field2, field3,
from temp_tableA;
注意:最后两步可以使用rename
。但是,此方法维护索引,外键关系和触发器(以及其他数据库约束)。
第一种方法显然更简单。但是,在大型表上,记录更新事务可能非常昂贵。通常,create table as
,truncate table
和大insert
比更新速度快。请注意,这也可以避免(无论好坏)任何更新触发器。