Les vues peuvent nuire aux performances lorsqu'elles contiennent de la logique, des colonnes, des lignes ou des tables qui ne sont pas utilisées par la requête finale. Je ne peux pas vous dire combien de fois j'ai vu des choses comme :
SELECT ...
FROM (View with complex UNION of ActiveCustomer and InactiveCustomer tables)
WHERE Active = True
(filtrant ainsi toutes les lignes de la table InactiveCustomer qui ont été incluses dans la vue), ou
SELECT (one column)
FROM (view that returns 50 columns)
(SQL doit récupérer un grand nombre de données qui sont ensuite rejetées lors d'une étape ultérieure. Il est possible que ces autres colonnes soient coûteuses à récupérer, comme par le biais d'une recherche de signets), ou
SELECT ...
FROM (view with complex filters)
WHERE (entirely different filters)
(il est probable que SQL aurait pu utiliser un index plus approprié si les tables avaient été interrogées directement), ou
SELECT (only fields from a single table)
FROM (view that contains crazy complex joins)
(beaucoup de surcharge CPU à travers la jointure, et des IO inutiles pour les lectures de table qui sont ensuite rejetées), ou mon préféré :
SELECT ...
FROM (Crazy UNION of 12 tables each containing a month of data)
WHERE OrderDate = @OrderDate
(Il lit 12 tables alors qu'il n'a besoin d'en lire qu'une).
En le plus Dans certains cas, SQL est suffisamment intelligent pour "voir à travers les couvertures" et proposer de toute façon un plan de requête efficace. Mais dans d'autres cas (en particulier les cas très complexes), il ne peut pas le faire. Dans chacune de ces situations, la solution a consisté à supprimer la vue et à interroger les tables sous-jacentes à la place.
A l'occasion de la au minimum (même si vous pensez que SQL serait suffisamment intelligent pour l'optimiser de toute façon), l'élimination de la vue peut parfois faciliter le débogage et l'optimisation de votre propre requête (ce qui doit être fait est un peu plus évident).