Sql server 2005 原子表的快速更换
我有一个相当简单的命令,偶尔会运行:Sql server 2005 原子表的快速更换,sql-server-2005,Sql Server 2005,我有一个相当简单的命令,偶尔会运行: BEGIN TRAN T1; truncate table mytable insert into mytable select name from myview COMMIT TRAN T1; 这个命令有两个丑陋的副作用:首先,mytable上的select请求经常超时。其次,mytable上的select请求有时不返回结果。我不关心它是否返回预事务结果或事务后结果,但不希望它返回中间的任何东西,或者超时。我想到的一个解决方案几乎肯定会有所帮助,就是首先
BEGIN TRAN T1;
truncate table mytable
insert into mytable select name from myview
COMMIT TRAN T1;
这个命令有两个丑陋的副作用:首先,mytable上的select请求经常超时。其次,mytable上的select请求有时不返回结果。我不关心它是否返回预事务结果或事务后结果,但不希望它返回中间的任何东西,或者超时。我想到的一个解决方案几乎肯定会有所帮助,就是首先将视图复制到临时表中(因为视图有点昂贵)。这并不能完全解决问题,但它几乎肯定会使窗口变得足够窄,从而使问题被忽略。坦率地说,窗口已经窄到可以忽略它了,但我不喜欢忽略它。另一个解决方案是疯狂过度工程的一个示例,它将使用两个表(例如,双缓冲区)替换该表,并调用最新的、正确填充的表
是否有一个更优雅的方法来替换一个新的表? < P>没有人会在中间看到任何东西。如果他们这样做了,那就意味着你在做肮脏的阅读,你应该得到你得到的每一个坏结果
您可以使用ALTERTABLE。。。交换机分区。。。在另一个表的内容中进行“切换”(必须具有相同的结构和约束)。该操作是原子化的,速度非常快,它只需更改周围的一些元数据指针,就可以让内容“神奇地”移动到目标表中。看见源表和目标表都不需要显式地“分区”,切换操作也可以在普通的单分区表上工作。有一种
ALTER TABLE switch
技术,或者您可以使用sp_rename-all。您使用的是什么事务隔离级别?我不知道如何设置它或使用什么。