sql - ver - no se puede usar el predicado contains or freetext en tabla o vista indizada
¿Es una vista más rápida que una simple consulta? (14)
Es un
select * from myView
más rápido que la consulta en sí para crear la vista (para tener el mismo conjunto de resultados):
select * from ([query to create same resultSet as myView])
?
No está del todo claro si la vista utiliza algún tipo de almacenamiento en caché, lo que lo hace más rápido en comparación con una consulta simple.
Al menos en SQL Server, los planes de consulta se almacenan en la memoria caché del plan tanto para las vistas como para las consultas SQL normales, según los parámetros de consulta / vista. Para ambos, se eliminan de la memoria caché cuando no se han utilizado durante un período suficientemente largo y se necesita el espacio para alguna otra consulta recién enviada. Después de lo cual, si se emite la misma consulta, se vuelve a compilar y el plan se vuelve a colocar en el caché. Entonces no, no hay diferencia, dado que está reutilizando la misma consulta SQL y la misma vista con la misma frecuencia.
Obviamente, en general, una vista, por su propia naturaleza (que alguien pensó que se iba a usar con la frecuencia suficiente para convertirla en una vista) generalmente es más probable que se "reutilice" que cualquier declaración SQL arbitraria.
Debería haber alguna ganancia trivial al tener el plan de ejecución almacenado, pero será insignificante.
Definitivamente, una vista es mejor que una consulta anidada para SQL Server. Sin saber exactamente por qué es mejor (hasta que leí la publicación de Mark Brittingham), realicé algunas pruebas y experimenté mejoras de rendimiento casi impactantes cuando usé una vista en lugar de una consulta anidada. Después de ejecutar cada versión de la consulta varios cientos de veces seguidas, la versión de vista de la consulta se completó en la mitad del tiempo. Yo diría que eso es prueba suficiente para mí.
El propósito de una vista es usar la consulta una y otra vez. Con ese fin, SQL Server, Oracle, etc. proporcionarán típicamente una versión "almacenada en caché" o "compilada" de su vista, mejorando así su rendimiento. En general, esto debería funcionar mejor que una consulta "simple", aunque si la consulta es realmente muy simple, los beneficios pueden ser insignificantes.
Ahora, si estás haciendo una consulta compleja, crea la vista.
En mi descubrimiento, usar la vista es un poco más rápido que una consulta normal. Mi procedimiento almacenado tardaba unos 25 minutos (trabajando con conjuntos de registros más grandes y múltiples combinaciones diferentes) y después de usar la vista (no agrupada), el rendimiento fue solo un poco más rápido pero nada significativo. Tuve que usar algunas otras técnicas / métodos de optimización de consultas para hacer un cambio dramático.
Espero que las dos consultas se realicen de manera idéntica. Una vista no es más que una definición de consulta almacenada, no hay almacenamiento en caché o almacenamiento de datos para una vista. El optimizador convertirá efectivamente su primera consulta en su segunda consulta cuando la ejecute.
Mi entendimiento es que hace un tiempo, una vista sería más rápida porque SQL Server podría almacenar un plan de ejecución y luego usarlo en lugar de tratar de resolver uno sobre la marcha. Creo que el aumento de rendimiento en la actualidad probablemente no sea tan bueno como lo fue antes, pero tendría que suponer que habría una mejora marginal para usar la vista.
No hay una práctica diferente y, si lee BOL, descubrirá que alguna vez su antiguo SQL SELECT * FROM X aprovechará el almacenamiento en caché del plan, etc.
Puede ser más rápido si crea una vista materializada ( con enlace de esquema ). Las vistas no materializadas se ejecutan igual que la consulta normal.
Seleccionar desde una vista o desde una tabla no tendrá mucho sentido.
Por supuesto, si la Vista no tiene uniones, campos, etc. innecesarios, puede verificar el plan de ejecución de sus consultas, uniones e índices utilizados para mejorar el rendimiento de la Vista.
Incluso puede crear un índice en las vistas para requisitos de búsqueda más rápidos. http://technet.microsoft.com/en-us/library/cc917715.aspx
Pero si está buscando como ''% ...%'' el motor sql no se beneficiará de un índice en la columna de texto. Si puede obligar a sus usuarios a realizar búsquedas como ''...%'', entonces será rápido.
se refirió a la respuesta en los foros de asp: https://forums.asp.net/t/1697933.aspx?Which+is+faster+when+using+SELECT+query+VIEW+or+Table+
Todo depende de la situación. Las vistas indizadas de MS SQL son más rápidas que las vistas o consultas normales, pero las vistas indizadas no se pueden usar en un entorno de base de datos duplicada (MS SQL).
Una vista en cualquier tipo de bucle causará una desaceleración grave porque la vista se vuelve a llenar cada vez que se llama en el bucle. Igual que una consulta. En esta situación, una tabla temporal que usa # o @ para mantener sus datos a lo largo del ciclo es más rápida que una vista o una consulta.
Así que todo depende de la situación.
EDIT: Estaba equivocado, y debería ver a Marks responder arriba.
No puedo hablar por experiencia con SQL Server , pero para la mayoría de las bases de datos, la respuesta sería no. El único beneficio potencial que obtiene, en lo que respecta al rendimiento, de utilizar una vista es que podría crear algunas rutas de acceso basadas en la consulta. Pero la razón principal para usar una vista es simplificar una consulta o estandarizar la forma de acceder a algunos datos en una tabla. En general, no obtendrá un beneficio de rendimiento. Yo podría, sin embargo, estar equivocado.
Daría un ejemplo moderadamente más complicado y lo vería usted mismo.
En términos generales, no. Las vistas se utilizan principalmente para mayor comodidad y seguridad, no para mejorar la velocidad.
Dicho esto, SQL Server 2000 y versiones posteriores tienen una característica especial llamada Vistas indizadas que puede mejorar considerablemente el rendimiento, pero debe crear vistas indizadas siguiendo un conjunto muy específico de pautas .
Hay una referencia importante en los Libros en línea con respecto a la resolución de la vista .
Aquí hay un artículo que describe los here :
Durante muchos años, Microsoft® SQL Server ™ ha admitido la capacidad de crear tablas virtuales conocidas como vistas. Históricamente, estos puntos de vista sirvieron a estos propósitos principales:
Para proporcionar un mecanismo de seguridad que restringe a los usuarios a un cierto subconjunto de datos en una o más tablas base.
Para proporcionar un mecanismo que permita a los desarrolladores personalizar cómo los usuarios pueden ver de manera lógica los datos almacenados en las tablas base.
Con SQL Server 2000, la funcionalidad de las vistas de SQL Server se amplió para proporcionar beneficios de rendimiento del sistema. Es posible crear un índice agrupado único en una vista, así como índices no agrupados, para mejorar el rendimiento del acceso a los datos en las consultas más complejas. En SQL Server 2000 y 2005, una vista que tiene un índice agrupado único se conoce como una vista indizada.
Sí , las vistas pueden tener un índice agrupado asignado y, cuando lo hacen, almacenarán resultados temporales que pueden acelerar las consultas resultantes.
Actualización: Al menos tres personas me han rechazado en este caso. Con el debido respeto, creo que están equivocados; La propia documentación de Microsoft deja muy claro que Views puede mejorar el rendimiento.
Primero, las vistas simples se expanden en su lugar y, por lo tanto, no contribuyen directamente a las mejoras de rendimiento, eso es cierto. Sin embargo, las vistas indexadas pueden mejorar dramáticamente el rendimiento.
Déjame ir directamente a la documentación:
Después de crear un índice agrupado único en la vista, el conjunto de resultados de la vista se materializa inmediatamente y se conserva en el almacenamiento físico en la base de datos, ahorrando la sobrecarga de realizar esta operación costosa en el momento de la ejecución.
En segundo lugar, estas vistas indizadas pueden funcionar incluso cuando otra consulta no hace referencia directa, ya que el optimizador las usará en lugar de una referencia de tabla cuando sea apropiado.
De nuevo, la documentación:
La vista indizada se puede utilizar en una ejecución de consulta de dos maneras. La consulta puede hacer referencia a la vista indexada directamente o, lo que es más importante, el optimizador de consultas puede seleccionar la vista si determina que la vista puede ser sustituida por alguna o toda la consulta en el plan de consulta de menor costo. En el segundo caso, la vista indexada se utiliza en lugar de las tablas subyacentes y sus índices ordinarios. No es necesario que se haga referencia a la vista en la consulta para que el optimizador de consultas la use durante la ejecución de la consulta. Esto permite que las aplicaciones existentes se beneficien de las vistas indexadas recién creadas sin cambiar esas aplicaciones.
Esta documentación, así como los gráficos que demuestran las mejoras de rendimiento, se pueden encontrar here .
Actualización 2: la respuesta ha sido criticada sobre la base de que es el "índice" lo que proporciona la ventaja de rendimiento, no la "Vista". Sin embargo, esto es fácilmente refutado.
Digamos que somos una empresa de software en un país pequeño; Usaré Lituania como ejemplo. Vendemos software en todo el mundo y mantenemos nuestros registros en una base de datos de SQL Server. Somos muy exitosos y, en pocos años, tenemos más de 1,000,000 de registros. Sin embargo, a menudo necesitamos informar las ventas con fines fiscales y descubrimos que solo hemos vendido 100 copias de nuestro software en nuestro país de origen. Al crear una vista indizada de solo los registros lituanos, podemos mantener los registros que necesitamos en un caché indexado como se describe en la documentación de MS. Cuando ejecutamos nuestros informes para ventas en lituano en 2008, nuestra consulta buscará a través de un índice con una profundidad de solo 7 (Log2 (100) con algunas hojas no utilizadas). ¡Si tuviéramos que hacer lo mismo sin la VISTA y solo confiando en un índice en la tabla, tendríamos que atravesar un árbol de índice con una profundidad de búsqueda de 21!
Claramente, la Vista en sí misma nos proporcionaría una ventaja de rendimiento (3x) sobre el simple uso del índice solo. He intentado usar un ejemplo del mundo real, pero notará que una simple lista de ventas en Lituania nos daría una ventaja aún mayor.
Tenga en cuenta que solo estoy usando un árbol b recto para mi ejemplo. Si bien estoy bastante seguro de que SQL Server utiliza alguna variante de un b-tree, no conozco los detalles. No obstante, el punto se mantiene.
Actualización 3: Ha surgido la pregunta de si una vista indexada solo usa un índice colocado en la tabla subyacente. Es decir, parafraseando: "una vista indexada es simplemente el equivalente a un índice estándar y no ofrece nada nuevo o único para una vista". Si esto fuera cierto, por supuesto, ¡el análisis anterior sería incorrecto! Permítame proporcionarle una cita de la documentación de Microsoft que demuestre por qué creo que esta crítica no es válida o verdadera:
Usar índices para mejorar el rendimiento de las consultas no es un concepto nuevo; sin embargo, las vistas indizadas proporcionan beneficios de rendimiento adicionales que no pueden lograrse utilizando índices estándar.
Junto con la cita anterior sobre la persistencia de los datos en el almacenamiento físico y otra información en la documentación sobre cómo se crean los índices en las Vistas, creo que es seguro decir que una Vista indizada no es solo una Selección SQL almacenada en caché que utiliza un Índice definido en la tabla principal. Por lo tanto, sigo apoyando esta respuesta.