web-dev-qa-db-fra.com

Pourquoi SQL n'utilise pas la vue indexée?

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?

6
Francisco G

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:

  1. L'arborescence du plan a été modifiée par l'activité précédente de l'optimiseur de telle sorte que la vue indexée ne correspond plus (ou du moins, ne peut plus être mise en correspondance par les outils disponibles pour l'optimiseur).
  2. L'optimiseur trouve un plan suffisamment bon (faible coût estimé) avant de rechercher des substituts de vue indexés.

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.

14
Paul White 9