代码之家  ›  专栏  ›  技术社区  ›  Brian

原子表的快速更换

  •  2
  • Brian  · 技术社区  · 16 年前

    BEGIN TRAN T1;
    truncate table mytable
    insert into mytable select name from myview
    COMMIT TRAN T1;
    

    这个命令有两个丑陋的副作用:首先,mytable上的select请求经常超时。其次,mytable上的select请求有时不返回结果。我不关心它是否返回预事务结果或事务后结果,但不希望它返回中间的任何东西,或者超时。我想到的一个解决方案几乎肯定会有所帮助,就是首先将视图复制到临时表中(因为视图有点昂贵)。这并不能完全解决问题,但它几乎肯定会使窗口变得足够窄,从而使问题被忽略。坦率地说,这扇窗户太窄了,可以忽略它 现在 ,但我不喜欢忽视它。另一个解决方案是疯狂过度工程的一个示例,它将使用两个表(例如,双缓冲区)替换该表,并调用最新的、正确填充的表。

    有没有更优雅的方式用新桌子替换桌子?

    2 回复  |  直到 16 年前
        1
  •  7
  •   Remus Rusanu    16 年前

    中间没有人应该看到任何东西。如果他们这样做了,那就意味着你在做肮脏的阅读,你应该得到你得到的每一个坏结果。

    Transferring Data Efficiently by Using Partition Switching . 源和目标都不需要显式地“分区”表,开关操作也可以在普通的单分区表上工作,。

        2
  •  4
  •   Brian    10 年前

    有一个 ALTER TABLE SWITCH 技术,也可以使用sp_rename-all discussed in detail here

    推荐文章