表格分流/急切地分流

3

I have a query

select * into NewTab from OpenQuery(rmtServer, 'select c1, c2 from rmtTab') 

当我查看执行计划时,它告诉我执行了一个“表卷/急速卷”操作,这个操作会“将数据存储在临时表中以优化回滚操作”。
但是我不预料会有任何回滚操作。如果出现某些意外情况,我可以直接删除新表并重新开始。
有没有办法停止将数据存储在临时表中?
2个回答

4

很可能是openquery导致了这个问题。

没有关于行数的信息,也没有统计数据,所以SQL Server将简单地将结果暂存以便后来评估。那就是基本的想法。

我建议分离新标签的创建和填充。

顺便说一句,rewind不是回滚。Rewind与事务安全无关。这是SQL Server预测行重用的正确方式。因为openquery是一个黑盒子。

在这篇Simple Talk文章的底部查看rewinds。你有一个“远程查询”。

编辑

根据我上周发现的内容,查看sp_tableoption

当使用OPENROWSET批量行集提供程序将数据导入到没有索引的表中时,TABLOCK可以使多个客户端并发地使用优化的日志记录和锁定将数据加载到目标表中

尝试在填充时使用TABLOCK。我们曾经有一个客户端开发人员使用.net SQLBulkCopy,性能非常差。

还有这个来自Kalen Delaney

这并不直观。


我尝试了分离创建和填充(也是Mladen建议的),但我得到了相同的查询计划。但那个链接非常有趣。 - cindi
我认为我对查询的简单看法是,远程查询将返回一张信息表,select/into 将创建一个空表,然后只需将获取的任何行复制到新表中。那么为什么要这样做两次呢? - cindi
2
在尝试从 INSERT INTO MyTable select * from LinkedServerSource 中去除一份急切的 spool 时,我遇到了这个问题。添加 TABLOCKX 解决了它。 - Martin Smith

1

先创建NewTab,然后使用openquery插入...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接