从视图插入临时表非常慢

时间:2013-09-02 12:06:00

标签: sql sql-server sql-server-2008 tsql temp-tables

我在查询中使用不同的临时表。当我执行下面的查询时

 select * from myView 

执行只需5秒钟。

但是当我执行

select * into #temp from myView 

需要50秒(比上述查询多10倍)。

我们从SQL Server 2000迁移到SQL Server 2008 R2。在SQL 2000之前,两个查询都需要相同的时间,但在SQL Server 2008中执行需要10倍。

4 个答案:

答案 0 :(得分:2)

老问题,但是由于我有类似的问题(虽然在SQL Server 2014上)并且以我在任何现有资源上都没有看到的方式解决它,我想我会分享希望它对其他人有帮助

我遇到了类似的情况:我创建的视图需要21秒才能返回完整的结果集,但是当我将其转换为{{1}时,需要花费10多分钟(此时我停止查询) SELECT..INTO是一个简单的,没有连接和谓词。我的预感是,优化器正在根据额外的SELECT语句更改原始计划,该语句不是简单地在第一个实例中提取数据集,然后执行INTO,而是在非常次地运行的方式。

我首先尝试了INSERT,试图先强制生成结果集,然后插入临时表。此方法的总运行时间为23秒,显然更接近原始OPENQUERY时间。在此之后,我返回到原始的SELECT查询并添加了SELECT..INTO提示以尝试复制OPTION (FORCE ORDER)行为。这似乎完成了伎俩,时间与OPENQUERY方法相同,为23秒。

我目前没有足够的时间来比较查询计划,但如果您遇到此问题,可以尝试使用快速而肮脏的选项:

OPENQUERY

答案 1 :(得分:0)

是的,我会检查你的命令的执行计划。某种东西可能会产生开销。

答案 2 :(得分:0)

我认为,你的tempdb数据库遇到了麻烦。可能是I / O速度慢,碎片化,RAID损坏等。

答案 3 :(得分:0)

在插入临时表之前,您的select语句中是否有order by子句,例如select * from myView order by col1?如果有顺序,则会大大减慢插入临时表的速度。如果是这种情况,请在插入发生时删除顺序,并在插入后按顺序删除

select * 
into #temp
from myView

然后按

申请
 select * from #temp order by col1