我正在使用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
本身有关,否则两个查询在执行时的行为大致相同。
我该如何处理这个问题?
答案 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语句中保留快速执行,然后你可以从那里提取你的数据,我想这将包含更少的行