更改表的SQL Server性能更改列更改数据类型
技术问答
101 人阅读
|
0 人回复
|
2023-09-13
|
我们需要将某些列的数据类型从int更改为bigint。不幸的是,其中一些表很大,大约有7-10百万行(但不宽)。+ z" p6 f/ \: I e
Alter表alter列将永远保留在这些表上。有没有更快的方法来实现这一目标?! \- c B/ a& V7 _0 w
* S0 }$ g( @3 \4 A+ D2 b6 ?# X' G解决方案:
& Q. t$ _% _9 D3 ^" [, W* a9 N 9 e$ ~. b* V; k& Z2 q
$ ?8 I% o& t p8 _& H0 y
5 ]* j: r. D/ Z% k0 D! O, p0 U. R
巧合的是,大约3个小时前,我不得不做一些非常相似的事情。该表是3500万行,它相当宽,并且花了很多时间才能做到这一点:
4 y& U ?, N6 a& {6 f" m, calter table myTable add myNewColumn int not null default 0;
9 P% P0 e/ F8 M- d! m这就是我最终得到的结果:
( Z) |$ o. G1 n+ p& M# a" xalter table myTable add myNewColumn int null;
4 g6 q* ?5 N; `+ L7 v1 u+ b1 \while 1=1; Q+ O0 p: O' z1 ^- T' F. L
begin3 u6 G( ?$ Z, d C, E5 @8 J3 f
update top (100000) myTable) v1 {$ S# s' |# U
set' q3 n: e! Z- j5 I7 n6 n
myNewColumn = 0
+ c$ D, \- z' s) s0 p5 M where4 N, c2 G0 k3 Q1 @
myNewColumn is null;4 @+ x7 H g( m3 ~' ^( f1 i( D
if @@ROWCOUNT = 0 break;
+ U }$ `4 x! H+ e4 L$ i, c' s+ eend. L+ n8 [/ k8 ~; T# v) [
alter table myTable alter column myNewColumn int not null;* @% H4 r' ~0 K5 ]% x0 |/ N* I9 A
alter table myTable add constraint tw_def_myNewColumn default (0) for myNewColumn;" ]$ X- F+ ^! @
这次,这些alter table陈述几乎是即时的。(在速度较慢的服务器上)花了大约7-8分钟的时间来执行更新批处理。我推测SQL
z/ M, |2 H2 w9 N( c7 TServer在原始查询中生成了还原操作以恢复值,但我没想到会从头开始。
- p0 I4 m7 k+ O2 K* A无论如何,就您而言,类似的事情可能会有所帮助。您可以尝试添加新的bigint列,分批更新新的列,然后在其上设置约束。 |
|
|
|
|
|