J'ai la version suivante de SQL Server:
Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64) Enterprise Edition (64 bits) sur Windows NT 6.3 (Build 9600:) (hyperviseur)
J'ai créé la vue suivante
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
J'ai ensuite créé l'index clusterisé
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)
Mais quand j'exécute la requête
SELECT IdGroup, IdOffice FROM dbo.[vwGroupsOfficesDependencies]
Je vois dans le plan d'exécution qu'il n'utilise pas la vue indexée, il effectue les jointures avec les tables à l'intérieur de la vue. Mais si j'inclus le conseil WITH (NOEXPAND), il utilise la vue indexée. J'ai lu que je dois inclure WITH (NOEXPAND) pour la version non Enterprise, mais dans mon cas ce n'est pas nécessaire. Pourquoi n'utilise-t-il pas la vue indexex?
Sauf si un indice NOEXPAND
est utilisé, SQL Server toujours étend la référence de la vue à la requête stockée sous-jacente avant le début de l'optimisation.
Il peut choisir ultérieurement de faire correspondre une ou plusieurs parties de l'ensemble du plan à une ou plusieurs vues indexées plus tard dans le processus d'optimisation.
Il y a deux raisons courantes pour lesquelles l'expansion d'origine n'est pas inversée plus tard:
Il existe d'autres raisons de préférer les indices NOEXPAND
. Par exemple, les statistiques ne sont créées automatiquement sur les vues indexées que lorsque cette indication est présente. Voir mon article ne autre raison d'utiliser les astuces NOEXPAND dans Enterprise Edition pour en savoir plus.