web-dev-qa-db-fra.com

Requête contre une vue vs. Query contre la table de base sous-jacente

On m'a dit d'interroger contre des points de vue sur notre ERP Système, car cela empêcherait les verrous mis sur les tableaux réels qui bloquent ainsi le travail réel effectué. Après avoir appris un peu plus sur SQL Server, je suis Pas sûr que cela est précis mais je voulais obtenir des éclaircissements.

Sachant qu'une vue n'est qu'une "requête sauvegarde", il semble que je interrogeais la table de base via la vue, il semblerait que cela n'aboutirait rien aussi en faveur de la blocking.

En d'autres termes si je fais ce qui suit et que je quitte ces ouvertures, je comprends que l'une ou l'autre bloquerait la table de vente écrit?

begin trans
select * from dbo.view_sales

versus

begin trans
select * from dbo.sales

Merci!

2
cspell

Cela dépend de la construction de la vue. SELECTing à partir d'une vue avec Nolock ou Readungimage des indications de table doit éviter de bloquer les tables sous-jacentes (avec les risques qui comporte).

Vues indexées (terme SQL Server - plus généralement appelé matérialisé vues) effectivement sont Stocké sur le disque séparément de leurs tables sous-jacentes et sont mises à jour car les tables sous-jacentes sont mises à jour. Cela consomme non seulement plus d'espace disque, mais peut entraîner des contenties et des retards si les tables sous-jacentes sont fréquemment modifiées. SELECTing à partir de la vue peut toujours bloquer les mises à jour des tables situées en dessous, puisque lorsque ces tables sont mises à jour, l'index de la vue est également mis à jour.

Et, comme vous le pensiez, SELECTing à partir d'une vue normale peut bloquer temporairement les requêtes qui changent les tables sous-jacentes, tout comme SELECTing à partir des termes directement.

2
RDFozz

Cela dépend du code à l'intérieur de dbo.view_sales. S'il s'agit d'interroger la table dbo.sales Tableau directement, alors oui, il pourrait y avoir blocage. Toutefois, si -dbo.view_sales est en fait une vue indexée (ou "la" vue matérialisée "sur les gens oracle), il ne devrait pas y avoir de blocage sur le dbo.sales tableau.

Une vue indexée aura ses données écrites sur disque, distinctes de la ou des tableaux de la requête que la vue appelle. Vous pouvez donc penser à une vue indexée comme sa propre table qui est automatiquement mise à jour chaque fois que les données dans les appels de table (s) sont mises à jour. Pour cette raison, lorsqu'une vue indexée est appelée, il doit interroger son propre ensemble de données et ne touchera pas la table dbo.sales, donc il n'y aura pas de blocage contre dbo.sales.

1
Eric Cobb

Vous avez raison. Une vue ne contient pas de données, mais fait simplement référence aux données d'autres objets de base de données. Les serrures devraient encore être placées sur les données de table sous-jacentes.

0
beastmaster283

En fonction du niveau de transaction, ces requêtes bloqueront les écrires. Le niveau d'isolation de transaction de lecture sérialisable et répétable déterrera S verrouillage (pendant toute la durée de la transaction), qui sont incompatibles avec les verrous X requis pour les écrivies (inserts/mises à jour).

Et oui, cela ne fait aucune différence, si vous vérifiez le plan d'exécution, vous verrez qu'ils sont exactement les mêmes.

Afin de prévenir le verrouillage et le blocage de la mise en œuvre de différents types d'objets ne vous donneront aucun résultat, mais la performance Boost (si utilisé Proc). Au lieu de cela, vous devriez changer de niveau d'isolement

0
S4V1N

Un de nos développeurs aime écrire,

CREATE VIEW theView AS SELECT * FROM theTable WITH (NOLOCK)  -- does not place a lock

Je ne peux pas décider si c'est un symptôme de génie ou, juste un symptôme.

Peut-être qu'ils préfèrent simplement ne pas être verrouillés de tables quand ils veulent les utiliser.

0
Robert Carnegie