Sye*_*hir 2 sql t-sql sql-server temp-tables sql-server-2008
我在查询中使用不同的临时表。当我执行下面的查询时
select * from myView
Run Code Online (Sandbox Code Playgroud)
执行仅需5秒。
但是当我执行时
select * into #temp from myView
Run Code Online (Sandbox Code Playgroud)
需要 50 秒(是上面查询的 10 倍)。
我们从 SQL Server 2000 迁移到 SQL Server 2008 R2。之前在 SQL 2000 中,这两个查询需要相同的时间,但在 SQL Server 2008 中,执行时间要多出 10 倍。
小智 5
老问题,但由于我有一个类似的问题(尽管在 SQL Server 2014 上)并以一种我在任何现成资源上都没有见过的方式解决它,我想我会分享,希望它对其他人有帮助。
我也遇到过类似的情况:我创建的视图需要 21 秒才能返回完整的结果集,但当我将其转换为 a 时,需要 10 多分钟(此时我停止了查询)SELECT..INTO 这SELECT是一个简单的视图,没有连接,也没有谓词。我的预感是优化器正在根据附加INTO语句更改原始计划,该语句并不像第一个实例那样简单地提取数据集,然后执行INSERT,而是以一种非常次优的方式更改它。
我首先尝试了OPENQUERY,试图强制首先生成结果集,然后插入到临时表中。该方法的总运行时间为 23 秒,显然更接近原始SELECT时间。之后,我返回到原始SELECT..INTO查询并添加了一个OPTION (FORCE ORDER)提示以尝试复制该OPENQUERY行为。这似乎成功了,而且时间与OPENQUERY,23 秒。
我目前没有足够的时间来比较查询计划,但如果您遇到此问题,作为一个快速而肮脏的选择,您可以尝试:
select * into #temp from myView option (force order);
Run Code Online (Sandbox Code Playgroud)