2009-07-06 8 views
4

Disons que j'ai un SQL Server Indexed View, vwIndexedView, qui lit de deux tables, tbTableOne et tbTableTwo.Est-ce que les vues indexées sont mises à jour pendant une transaction?

Si j'effectue une action sur l'une des deux tables d'une transaction, qu'advient-il de ma vue indexée? Est-il rafraîchi immédiatement, ou dois-je valider ma transaction avant que les résultats ne l'alimentent?

Par exemple:

BEGIN TRANSACTION testTransaction 
INSERT INTO tbTableOne VALUES ('1', '2') 
SELECT * FROM vwIndexedView 
COMMIT TRANSACTION 

SELECT * FROM vwIndexedView 

Est-ce que les résultats de la première SELECT est différente de la deuxième?

Répondre

9

Un index ou une vue indexée est mis à jour immédiatement dans le cadre de l'instruction DML effectuant la mise à jour. Dans votre cas, si vous analysez le plan d'exécution réel de l'INSERT, vous verrez qu'il contient des opérateurs pour la mise à jour de toutes les 'partitions' physiques, et la vue indexée est l'une de ces partitions.

0

Est-ce une table centralisée? I.E en le verrouillant pour l'insertion dans la transaction allez-vous faire attendre des tonnes d'autres spids? La réponse simple est oui, les vues seront mises à jour avec les nouvelles valeurs, mais cela créera des maux de tête de performance que vous devriez considérer aussi s'il y a d'autres endroits que vous insérez dans ces tables sous-jacentes.

2

Les vues indexées s'actualisent immédiatement, vous pouvez consulter le plan d'exécution et voir par vous-même. Cela provoque beaucoup de contention de verrou: be ready to drop your indexed view