从视图插入临时表非常慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从视图插入临时表非常慢相关的知识,希望对你有一定的参考价值。

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

 select * from myView 

执行只需5秒钟。

但是当我执行

select * into #temp from myView 

它需要50秒(比上面的查询多10倍)。

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

答案

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

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

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

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

select * into #temp from myView option (force order);
另一答案

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

另一答案

我想,你的tempdb数据库有问题。可能是I / O速度慢,碎片化,RAID损坏等。

另一答案

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

select * 
into #temp
from myView

然后按顺序申请

 select * from #temp order by col1

以上是关于从视图插入临时表非常慢的主要内容,如果未能解决你的问题,请参考以下文章

快速选择但慢速插入选择

是否可以在 Redshift 中并行运行查询?

执行 SQL 案例表达式非常慢(查询优化)

需要将数据全部插入到临时表中

SQL 从临时表插入表,并将输出插入临时表

子查询 X 临时表 X 动态 sql X 表值函数