为什么 SQL 不使用索引视图?

Fra*_*o G 6 sql-server optimization hints materialized-view sql-server-2014

我有以下版本的 SQL Server:

Microsoft SQL Server 2014 (SP3) (KB4022619) - Windows NT 6.3 上的 12.0.6024.0 (X64) 企业版(64 位)(内部版本 9600:)(管理程序)

我创建了以下视图

CREATE VIEW [dbo].[vwGroupsOfficesDependencies]
WITH SCHEMABINDING 
AS
SELECT        GC.IdGroup, COUNT_BIG(*) AS countBig, OD.IdOffice
FROM            dbo.Group AS GC INNER JOIN
                         dbo.GroupDependencies AS GD ON GC.IdGroup = GD.IdGroup INNER JOIN
                         dbo.OfficeDependencies AS OD ON OD.IdDependency = GD.IdDependency INNER JOIN
                         dbo.Dependencies AS D ON D.IdDependency = GD.IdDependency
WHERE        (D.Active = 1)
GROUP BY GC.IdGroup, OD.IdOffice
Run Code Online (Sandbox Code Playgroud)

然后我创建了聚集索引

CREATE UNIQUE CLUSTERED INDEX [IX_vwGroupsOfficesDependencies_IdOficeIdGroup] ON [dbo].[vwGroupsOfficesDependencies]
(
    [IdGroup] ASC,
    [IdOffice] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
Run Code Online (Sandbox Code Playgroud)

但是当我运行查询时

SELECT IdGroup, IdOffice FROM dbo.[vwGroupsOfficesDependencies]
Run Code Online (Sandbox Code Playgroud)

我在执行计划中看到它不使用索引视图,它执行与视图内表的连接。但是,如果我包含 WITH(NOEXPAND) 提示,它将使用索引视图。我读到我必须为非企业版包含 WITH(NOEXPAND) ,但在我的情况下它不是必需的。为什么不使用 indexex 视图?

Pau*_*ite 14

除非使用NOEXPAND提示,否则SQL Server总是在优化开始之前扩展对基础存储查询的视图引用。

稍后在优化过程中,它可能会选择将部分或整个计划匹配回一个或多个索引视图。

最初的扩展后来没有逆转有两个常见原因:

  1. 计划树已被先前的优化器活动更改为索引视图不再匹配(或至少,优化器可用的工具不再匹配)。
  2. 优化器会在寻找索引视图替代品之前找到一个足够好的(估计成本低)计划。

还有其他原因更喜欢NOEXPAND提示。例如,只有在存在该提示时才会在索引视图上自动创建统计信息。有关更多信息,请参阅我的文章在企业版中使用 NOEXPAND 提示的另一个原因