回答

收藏

更改表的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列,分批更新新的列,然后在其上设置约束。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则