¿Cuáles son las desventajas de usar vistas SQLServer?


¿Cuáles son las desventajas de usar vistas SQLServer?

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-documentación, 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 mismos campos, las mismas uniones de tabla) desde diferentes ángulos.

Pero hay un costo para ¿crear y usar estas vistas?

¿Estoy desacelerando (o acelerando?) query processing?

Author: Lill Lansey, 2010-11-03

10 answers

Cuando se trata de Vistas hay ventajas y desventajas.

Ventajas:

  1. 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.
  2. Se puede usar como una medida de seguridad al restringir lo que el usuario puede ver.
  3. puede hacer Que comúnmente utilizado consultas complejas para facilitar la lectura del encapsular en una vista. Sin embargo, esta es una espada de doble filo-ver desventajas #3.

Desventajas:

  1. No tiene un plan de ejecución optimizado almacenado en caché, por lo que no será tan rápido como un procedimiento almacenado.
  2. Dado que básicamente es solo una abstracción de un SELECT, es marginalmente más lento que hacer un SELECT puro.
  3. Puede ocultar la complejidad y llevar a gotchas. (Gotcha: ORDEN POR no honrado).

Mi opinión personal es no usar vistas, sino usar procedimientos almacenados, ya que proporcionan la seguridad y la encapsulación de vistas, sino que también vienen con un rendimiento mejorado.

 19
Author: hyprsleepy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-03 22:54:34

Una posible desventaja de usar vistas es que abstrae la complejidad del diseño subyacente que puede conducir a abusos por parte de desarrolladores junior y creadores de informes.

Para un proyecto particularmente grande y complejo diseñé un conjunto de vistas que iban a ser utilizadas principalmente por los diseñadores de informes para poblar crystal reports. Descubrí semanas más tarde que los desarrolladores junior habían comenzado a usar estas vistas para buscar agregados y unirse a estas vistas ya grandes simplemente porque estaban allí y estaban fácil 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 tomaban muchos minutos en ejecutarse.

 10
Author: Paul Sasik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-03 14:05:35

La eficiencia de una vista depende en gran parte de las tablas subyacentes. La vista realmente es una forma organizada y consistente de ver los resultados de las consultas. Si la consulta utilizada para formar la vista es buena y utiliza í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.

 7
Author: JNK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-03 13:53:39

También uso vistas regularmente. Una cosa a tener en cuenta, sin embargo, es que usar muchas vistas podría ser difícil de mantener si sus tablas subyacentes cambian con frecuencia (especialmente durante el desarrollo).

EDITAR: Dicho esto, encuentro que la conveniencia y la ventaja de poder simplificar y reutilizar consultas complejas supera el problema de mantenimiento, especialmente si las vistas se usan de manera responsable.

 4
Author: dotariel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-03 14:12:38

Las vistas pueden perjudicar el rendimiento cuando la vista contiene lógica, columnas, filas o tablas que la consulta final no utiliza en última instancia. No puedo decirte 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 desde la tabla InactiveCustomer), o

SELECT (one column)
FROM (view that returns 50 columns)

(SQL tiene que recuperar muchos datos que luego se descartan en un paso posterior. Es posible que esas otras columnas sean caras de recuperar, como a través de un marcador búsqueda), o

SELECT ...
FROM (view with complex filters)
WHERE (entirely different filters)

(es probable que SQL podría haber utilizado 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)

(mucha sobrecarga de CPU a través de la unión, y E / s innecesarias 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 llegar a un plan de consulta eficaz de todos modos. Pero en otros en cada una de las situaciones anteriores, la respuesta fue eliminar la vista y consultar las tablas subyacentes en su lugar.

Al menos (incluso si cree 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 lo que hay que hacer).

 4
Author: BradC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-03 17:22:57

Un inconveniente de las vistas que he encontrado es una inmersión en el rendimiento al incorporarlas en consultas distribuidas. Este SQLMag artículo 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.

 3
Author: Will A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-03 14:03:25

¿Cuáles son las Diversas limitaciones de las vistas en SQL Server?

Top 11 Limitaciones de vistas

  • Las vistas no soportan COUNT (); sin embargo, puede soportar COUNT_BIG ()
  • La cláusula ORDER BY no funciona a 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, entonces tendremos que modificarlas primero
  • Índice creado a la vista no utilizado a menudo
  • Una vez que se crea la vista y si la tabla básica tiene alguna columna añadida o eliminada, generalmente no se refleja en la vista hasta que se actualiza
  • La operación de UNIÓN no está permitida en la Vista indexada
  • No podemos crear un Índice en una vista anidada situación significa que no podemos crear un índice en una vista que se construye desde otra vista.
  • No se permite la UNIÓN AUTOMÁTICA en la Vista Indexada
  • No se permite la Unión Externa en Indexado Vistas
  • No Se permiten Consultas Cruzadas de Bases de Datos en la Vista Indexada

Source SQL MVP Pinal Dave

Http://blog.sqlauthority.com/2010/10/03/sql-server-the-limitations-of-the-views-eleven-and-more/

 2
Author: Bryan Swan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-26 03:11:36

Cuando comencé, siempre pensé que las vistas agregaban sobrecarga de rendimiento, sin embargo, la experiencia pinta una historia diferente (el mecanismo de vista en sí tiene una sobrecarga insignificante).

Todo depende de cuál sea la consulta subyacente. Echa un vistazo a las vistas indexadas aquí o aquí , en última instancia, debe probar el rendimiento de ambas maneras para obtener un perfil de rendimiento claro

 1
Author: Mr Shoubs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-03 14:15:10

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 lejos de usar vistas a SPROCS (que tienen más que suficientes problemas propios) en unos pocos casos en los que no pude especificar un ORDEN más tarde. (Me gustaría que hubiera una construcción con "VISTA FINAL" possibly por ejemplo, posiblemente incluir orden por -- semántica).

Http://blog.sqlauthority.com/2010/10/03/sql-server-the-limitations-of-the-views-eleven-and-more/ (La limitación # 1 es sobre el ORDEN POR: -)

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-03 17:31:26

Lo siguiente es un hack SQL que permite hacer referencia a un order by 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
 -2
Author: Raul Fernandez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-18 23:56:16