web-dev-qa-db-fra.com

Impossible de créer un index sur la vue 'View_Table_Name' car la vue n'est pas liée au schéma

J'utilise Views dans ma procédure stockée (SQL-Server). Pour améliorer les performances, j'ai essayé de créer INDEX de cette vue.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER VIEW VW_Table_Name
AS
SELECT Col1,Col2,Col3 FROM Table_Name 
GO
CREATE UNIQUE CLUSTERED INDEX Index_Name ON [VW_Table_Name](Col1)
GO

Ici, je reçois l'erreur comme

Msg 1939, niveau 16, état 1, ligne 1 Impossible de créer un index sur la vue 'VW_FML' car la vue n'est pas liée au schéma.

Pouvons-nous créer un index pour la vue dans SQL Server?

51
Jagadeesh

Il existe un certain nombre de restrictions sur les vues indexées: pas de sous-requêtes, pas d'unions, pas de jointures externes, etc. Voir cet article pour plus de détails. Mais pour votre cas, il vous suffit de créer la vue avec la liaison de schéma.

CREATE VIEW VW_Table_Name WITH SCHEMABINDING
AS
SELECT Col1,Col2,Col3 FROM Table_Name 
GO
75
Joe Stefanelli

Parce que vous essayez de créer une vue indexée ou vue matérialisée. Il est obligatoire pour une vue d'avoir l'option "WITH SCHEMABINDING" si vous créez un index clusterisé dessus.

Une vue n'est rien d'autre qu'une requête stockée, si vous allez créer un index dessus, alors l'index va utiliser cette requête et l'exécuter sur cette table, dans ce cas vous devez vous assurer que la table ne change pas sous. Ainsi, en appliquant cette contrainte, SQL Server s'assure que tout reste synchronisé.

5
Manoj Pandey