使用视图的 SQL Server 执行计划,但存储过程中没有视图

Jos*_*ose 3 performance view sql-server-2012 query-performance

我正在对这个缓慢的存储过程进行故障排除,在检查实际执行计划时,我注意到一个可能缺少索引的警告。仔细看看,它反对其中一个观点,而不是实际的表格。这怎么可能?

当然,物理表正在使用,但实际视图不是!

视图是这样的:

CREATE VIEW [ws].[MyVIEWTable]
WITH SCHEMABINDING
AS
SELECT col1, col2
  FROM [dbo].[MyTable]
Run Code Online (Sandbox Code Playgroud)

为什么 SQL Server 引擎使用视图来检索数据而不是实际的物理表,在这种情况下是dbo.MyTable

Aar*_*and 5

所以它是一个索引视图——如果基表被引用并且索引视图可以(更好地)满足查询,SQL Server 可以自动选择使用索引视图。

来自MSDN(强调我的):

查询不必在 FROM 子句中显式引用索引视图,以便查询优化器使用索引视图。如果查询包含对也存在于索引视图中的基表中的列的引用,并且查询优化器估计使用索引视图提供最低成本的访问机制,则查询优化器选择索引视图 [...]

此外,如您所见,缺失索引算法可能会轻推您说:“嘿,何塞,如果您将此非聚集索引添加到索引视图中,我可能已经能够在视图上使用索引,这对于查询,效率会更高。” 同样,即使在查询中没有明确提及视图,这种关联也可能发生。

通常,除非您在所有视图上都添加索引,因为您认为它们是一些神奇的性能银弹,否则访问索引视图将比访问基表更好,因为 - 同样通常 - 索引视图应该比它所基于的表。