为什么VIEW中的SELECT *执行速度比同一个VIEW中的SELECT(特定列)更快?

时间:2018-02-27 10:19:59

标签: sql sql-server

我正在使用SQL Server 2012。我有一个名为VIEW的{​​{1}},我有2个MyView个查询,这些查询从T_SQL中提取数据。

查询1非常简单,如下所示:

VIEW

以上查询在大约28秒内执行并返回151,000行。

查询2如下所示:

SELECT * 
FROM MyView
WHERE StayDate >= '2018-03-01'

查询2的执行时间无限。我不得不在大约8分钟后取消执行!!

我的问题是我需要将查询2用于特定任务。造成执行时间差异的原因是什么?

SELECT [Col A], [Col B], [Col C], [Col D], [Col E] FROM MyView WHERE StayDate >= '2018-03-01' ' MyView'有几个与其他表的连接和一些内置的VIEW语句。我不认为这个问题与CASE本身有关,否则两个查询在执行时的行为大致相同。

我该如何处理这个问题?

2 个答案:

答案 0 :(得分:0)

执行查询时,代码将传递给SQL查询优化程序。它创建执行计划并将其缓存到内存池。当您再次执行相同的查询时,它会使用该执行计划并更快地检索信息。有时,如果两个查询以相同的执行计划结束,则它们都可以使用内存池中的缓存查询。

由于视图只是存储的代码(字面意思与保存和执行sql文件相同),因此应该重复使用。因此,您可以完全期望为视图提供一些缓存的EP。

唉,这不是这种情况。

答案 1 :(得分:0)

可能您的服务器出于某种原因决定采用另一个执行计划。我不知道对此的正确解决方案,但你应该更新统计数据或其他东西。

以下是我遇到类似问题时使用的一些解决方法示例:

SELECT [Col A], [Col B], [Col C], [Col D], [Col E] 
FROM MyView 
WHERE StayDate >= '2018-03-01'
option(recompile)

这将忽略统计数据并在运行中计算出一个新的执行计划,希望这个计划不会是慢的

SELECT * 
INTO #temp 
FROM MyView
WHERE StayDate >= '2018-03-01'

SELECT [Col A], [Col B], [Col C], [Col D], [Col E] 
FROM #temp 
WHERE StayDate >= '2018-03-01'

也许它会在insert语句中保留快速执行,然后你可以从那里提取你的数据,我想这将包含更少的行