我有一个相当简单的命令,我偶尔会运行:
BEGIN TRAN T1;
truncate table mytable
insert into mytable select name from myview
COMMIT TRAN T1;
Run Code Online (Sandbox Code Playgroud)
这个命令有两个丑陋的副作用:首先,在mytable上选择请求经常超时.其次,在mytable上选择请求有时不会返回任何结果.我不在乎它是否返回事务前结果或事后结果,但不希望它返回中间的任何内容,或者超时.我想到的一个解决方案,几乎肯定会有所帮助,首先将视图复制到临时表中(因为视图有点贵).这不能完全解决问题,但它几乎肯定会使窗口缩小到足以使问题被忽略.坦率地说,窗口很窄,现在可以忽略它,但我不喜欢忽略它.另一个解决方案,即疯狂的过度工程的一个例子,将用两个表(例如双缓冲区)替换表,并调用最新的,正确填充的表.
是否有更优雅的方式用新的表替换表?
没有人应该在中间看到任何东西.如果他们这样做,那就意味着你正在做脏读,你应该得到你得到的每一个糟糕的结果.
您可以使用ALTER TABLE ... SWITCH PARTITION ...来"切换"另一个表的内容(必须具有相同的结构和约束).操作是原子的,快速的,它简单地改变一些元数据指针,使内容"神奇地"移动到目标表中.请参阅使用分区切换有效传输数据.源和目标都不需要显式"分区"表,切换操作也适用于普通的单分区表.