I have a query
select * into NewTab from OpenQuery(rmtServer, 'select c1, c2 from rmtTab')
当我查看执行计划时,它告诉我执行了一个“表卷/急速卷”操作,这个操作会“将数据存储在临时表中以优化回滚操作”。
但是我不预料会有任何回滚操作。如果出现某些意外情况,我可以直接删除新表并重新开始。
有没有办法停止将数据存储在临时表中?
I have a query
select * into NewTab from OpenQuery(rmtServer, 'select c1, c2 from rmtTab')
很可能是openquery导致了这个问题。
没有关于行数的信息,也没有统计数据,所以SQL Server将简单地将结果暂存以便后来评估。那就是基本的想法。
我建议分离新标签的创建和填充。
顺便说一句,rewind不是回滚。Rewind与事务安全无关。这是SQL Server预测行重用的正确方式。因为openquery是一个黑盒子。
在这篇Simple Talk文章的底部查看rewinds。你有一个“远程查询”。
编辑
根据我上周发现的内容,查看sp_tableoption。
当使用OPENROWSET批量行集提供程序将数据导入到没有索引的表中时,TABLOCK可以使多个客户端并发地使用优化的日志记录和锁定将数据加载到目标表中
尝试在填充时使用TABLOCK。我们曾经有一个客户端开发人员使用.net SQLBulkCopy,性能非常差。
还有这个来自Kalen Delaney
这并不直观。
先创建NewTab,然后使用openquery插入...
INSERT INTO MyTable select * from LinkedServerSource
中去除一份急切的 spool 时,我遇到了这个问题。添加TABLOCKX
解决了它。 - Martin Smith