【发布时间】:2018-02-27 10:19:58
【问题描述】:
我正在使用SQL Server 2012。我有一个名为MyView 的VIEW,我有2 个T_SQL 查询从VIEW 中提取数据。
查询 1 非常简单,如下所示:
SELECT *
FROM MyView
WHERE StayDate >= '2018-03-01'
上述查询在大约 28 秒内执行并返回 151,000 行。
查询 2 如下所示:
SELECT [Col A], [Col B], [Col C], [Col D], [Col E]
FROM MyView
WHERE StayDate >= '2018-03-01'
查询 2 的执行时间不确定。我不得不在大约 8 分钟后取消执行!!
我的问题是我需要将查询 2 用于特定任务。是什么导致了执行时间的这种差异?
VIEW 'MyView' 有几个与其他表的连接和一些内置的CASE 语句。我认为这个问题与VIEW 本身无关,否则这两个查询在执行过程中的行为方式或多或少是相同的。
我该如何处理这个问题?
【问题讨论】:
-
会不会是缓存结果?
-
您可以查看每个查询的估计执行计划吗?
-
您可以查看查询计划并将其粘贴到此处。估计的和实际的。请记住,使用
*可能会导致您的查询不使用索引,即使它们已经到位,请查看blog article。 -
如果您没有查询某些列,并且优化器能够证明它们不会影响结果(行数和行数都不存在),它将得出不同的 (更轻量级)计划完全忽略这些列。你可能有一个基数估计问题,服务器在提出一个轻量级计划时,认为某些东西会变得非常便宜,而事实证明并非如此,并且完整的计划根本不会尝试使用那个出乎意料的昂贵的东西,因此轻量级计划最终变得更重。可以更新统计信息吗?
-
如果网速好,如果指定列,连续流所有页面不是比检索部分更快吗?
标签: sql sql-server