sql - 为什么来自 VIEW 的 SELECT * 比来自同一个 VIEW 的 SELECT(特定列)执行得更快?

标签 sql sql-server

我正在使用 SQL Server 2012 .我有一个 VIEWMyView我有 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 无关。本身,否则两个查询在执行过程中的行为或多或少会相同。

我该如何处理这个问题?

最佳答案

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

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

唉,这里不是这样。

关于sql - 为什么来自 VIEW 的 SELECT * 比来自同一个 VIEW 的 SELECT(特定列)执行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49006271/

相关文章:

mysql - SQL-如何查找包含时间戳的同一列的两行之间的差异

c# - Dapper 调用存储过程并将结果映射到类

c# - Linq 插入 : The column name ' ' is specified more than once in the SET clause or column list of an INSERT

c# - 无效的列名 SQL Server

sql-server - 左连接表 A 和表 B

java - 从 SQL 查询中获取表值

mysql - 在子查询中重用联接表

SQL 数据透视函数

重负载下SQL Server检索错误(200并发用户)

sql - SQL 内连接问题