sql server - transact - ¿Cuáles son las desventajas de usar SqlServer Views?
sql server syntax where (10)
¿Cuáles son las desventajas de usar SqlServer Views?
Creo vistas con frecuencia para mostrar mis datos en una forma desnormalizada.
Me resulta mucho más fácil y, por lo tanto, más rápido, menos propenso a errores y más auto-documentado, consultar una de estas uniones en lugar de generar consultas complejas con uniones complicadas entre muchas tablas. Especialmente cuando estoy analizando los mismos datos (muchos campos iguales, juntas de la misma tabla) desde diferentes ángulos.
¿Pero hay un costo para crear y usar estas vistas?
¿Estoy desacelerando (o acelerando) el procesamiento de consultas?
A continuación se muestra un hackeo de SQL que permite hacer referencia a un pedido en una vista:
create view toto1 as
select top 99.9999 percent F1
from Db1.dbo.T1 as a
order by 1
Pero mi preferencia es usar Row_Number
:
create view toto2 as
select *, ROW_NUMBER() over (order by [F1]) as RowN from (
select f1
from Db1.dbo.T1) as a
Cuando comencé, siempre creía que la sobrecarga de rendimiento agregada, sin embargo, la experiencia pinta una historia diferente (el mecanismo de visualización en sí tiene una sobrecarga insignificante).
Todo depende de lo que es la consulta subyacente. Echa un vistazo a las vistas indizadas aquí o here , en última instancia, debes probar el rendimiento de ambas maneras para obtener un perfil de rendimiento claro
Cuando se trata de vistas hay ventajas y desventajas.
Ventajas:
- Son tablas virtuales y no se almacenan en la base de datos como un objeto distinto. Todo lo que se almacena es la instrucción SELECT.
- Puede utilizarse como medida de seguridad al restringir lo que el usuario puede ver.
- Puede hacer que las consultas complejas de uso común sean más fáciles de leer al encapsularlas en una vista. Sin embargo, esta es una espada de doble filo - vea las desventajas # 3.
Desventajas:
- No tiene un plan de ejecución optimizado en caché, por lo que no será tan rápido como un procedimiento almacenado.
- Como básicamente es solo una abstracción de un SELECT, es ligeramente más lento que hacer un SELECTO puro.
- Puede ocultar la complejidad y llevar a las trampas. (Gotcha: ORDEN POR no honrado).
Mi opinión personal es no usar Vistas, sino usar procedimientos almacenados, ya que brindan la seguridad y la encapsulación de Vistas, pero también ofrecen un rendimiento mejorado.
La eficiencia de una vista depende en gran parte de las tablas subyacentes. La vista realmente es solo una forma organizada y coherente de ver los resultados de las consultas. Si la consulta utilizada para formar la vista es buena y utiliza los índices adecuados en las tablas subyacentes, la vista no debería afectar negativamente al rendimiento.
En SQL Server también puede crear vistas materializadas o indexadas (desde SQL Server 2000), que aumentan un poco la velocidad.
Las vistas pueden ser un detrimento para el rendimiento cuando la vista contiene lógica, columnas, filas o tablas que no son utilizadas finalmente por su consulta final. No te puedo decir cuántas veces he visto cosas como:
SELECT ...
FROM (View with complex UNION of ActiveCustomer and InactiveCustomer tables)
WHERE Active = True
(filtrando así todas las filas que se incluyeron en la vista de la tabla InactiveCustomer), o
SELECT (one column)
FROM (view that returns 50 columns)
(SQL tiene que recuperar una gran cantidad de datos que luego se descartan en un paso posterior. Es posible que esas otras columnas sean costosas de recuperar, como a través de una búsqueda de marcadores), o
SELECT ...
FROM (view with complex filters)
WHERE (entirely different filters)
(es probable que SQL haya usado un índice más apropiado si las tablas se consultaron directamente), o
SELECT (only fields from a single table)
FROM (view that contains crazy complex joins)
(gran cantidad de sobrecarga de CPU a través de la unión, e IO innecesaria para las lecturas de la tabla que luego se descartan), o mi favorito:
SELECT ...
FROM (Crazy UNION of 12 tables each containing a month of data)
WHERE OrderDate = @OrderDate
(Lee 12 tablas cuando realmente solo necesita leer 1).
En la mayoría de los casos, SQL es lo suficientemente inteligente como para "ver a través de las cubiertas" y crear un plan de consulta efectivo de todos modos. Pero en otros casos (especialmente los muy complejos), no puede. En cada una de las situaciones anteriores, la respuesta fue eliminar la vista y consultar las tablas subyacentes.
Como mínimo (incluso si piensa que SQL sería lo suficientemente inteligente como para optimizarlo de todos modos), eliminar la vista a veces puede hacer que su propia depuración y optimización de consultas sea más fácil (un poco más obvio de lo que debe hacerse).
Mi mayor "queja" es que ORDER BY no funciona en una vista. Si bien tiene sentido, es un caso que puede saltar y morder si no se espera. Debido a esto, he tenido que cambiar el uso de vistas a SPROCS (que tienen sus propios problemas más que suficientes) en algunos casos en los que no pude especificar una ORDEN POR. (Desearía que hubiera una construcción con "VISTA FINAL", por ejemplo, incluir semántica de orden).
http://blog.sqlauthority.com/2010/10/03/sql-server-the-limitations-of-the-views-eleven-and-more/ (Limitación # 1 es sobre ORDENAR POR :-)
Una desventaja de las vistas con las que me he encontrado es una inmersión en el rendimiento al incorporarlas en consultas distribuidas. Este artículo de SQLMag discute, y mientras uso datos altamente artificiales en la demostración, me he encontrado con este problema una y otra vez en el "mundo real".
Respeta tus puntos de vista, y te tratarán bien.
Una posible desventaja del uso de las vistas es que abstraes la complejidad del diseño subyacente que puede provocar el abuso por parte de desarrolladores junior y creadores de informes.
Para un proyecto particularmente grande y complejo, diseñé un conjunto de vistas que debían ser utilizadas principalmente por los diseñadores de informes para poblar informes de cristal. Descubrí semanas más tarde que los desarrolladores junior habían comenzado a usar estas vistas para obtener agregados y unirse a estas vistas ya grandes simplemente porque estaban allí y eran fáciles de consumir. (Había un fuerte elemento de diseño de EAV en la base de datos). Me enteré de esto después de que los desarrolladores junior comenzaron a preguntar por qué los informes aparentemente simples tardaban muchos minutos en ejecutarse.
Yo uso vistas regularmente también. Sin embargo, una cosa a tener en cuenta es que usar muchas vistas puede ser difícil de mantener si las tablas subyacentes cambian con frecuencia (especialmente durante el desarrollo).
EDITAR: Habiendo dicho eso, encuentro que la conveniencia y la ventaja de poder simplificar y reutilizar las consultas complejas supera el problema de mantenimiento, especialmente si las vistas se usan de manera responsable.
¿Cuáles son las diversas limitaciones de las vistas en SQL Server?
Top 11 limitaciones de vistas
- Las vistas no admiten COUNT ( ); sin embargo, puede soportar COUNT_BIG ( )
- La cláusula ORDER BY no funciona en la vista
- Las consultas regulares o los procedimientos almacenados nos dan flexibilidad cuando necesitamos otra columna; Podemos agregar una columna a las consultas regulares de inmediato. Si queremos hacer lo mismo con las Vistas, primero tendremos que modificarlas.
- Índice creado en la vista no se utiliza a menudo
- Una vez que se crea la vista y si la tabla básica tiene alguna columna agregada o eliminada, generalmente no se refleja en la vista hasta que se actualiza
- La operación UNION no está permitida en la vista indizada
- No podemos crear un índice en una situación de vista anidada significa que no podemos crear un índice en una vista que se construye desde otra vista.
- SELF JOIN no permitido en vista indizada
- Uniones externas no permitidas en vistas indizadas
- Consultas cruzadas de base de datos no permitidas en vista indizada
Fuente SQL MVP Pinal Dave
http://blog.sqlauthority.com/2010/10/03/sql-server-the-limitations-of-the-views-eleven-and-more/