En informática , una vista materializada es un objeto de base de datos que contiene los resultados de una consulta . Por ejemplo, puede ser una copia local de datos ubicados de forma remota, o puede ser un subconjunto de las filas y/o columnas de una tabla o resultado de una unión , o puede ser un resumen que utiliza una función de agregación .
El proceso de configuración de una vista materializada a veces se denomina materialización . [1] Esta es una forma de almacenar en caché los resultados de una consulta, similar a la memorización del valor de una función en lenguajes funcionales, y a veces se describe como una forma de precomputación . [2] [3] Al igual que con otras formas de precomputación, los usuarios de bases de datos suelen utilizar vistas materializadas por razones de rendimiento, es decir, como una forma de optimización. [4]
Las vistas materializadas que almacenan datos basados en tablas remotas también se conocían como instantáneas [5] (terminología obsoleta de Oracle ).
En cualquier sistema de gestión de bases de datos que siga el modelo relacional , una vista es una tabla virtual que representa el resultado de una consulta de base de datos . Siempre que una consulta o una actualización se dirige a una tabla virtual de una vista normal, el DBMS las convierte en consultas o actualizaciones contra las tablas base subyacentes. Una vista materializada adopta un enfoque diferente: el resultado de la consulta se almacena en caché como una tabla concreta ("materializada") (en lugar de una vista como tal) que puede actualizarse a partir de las tablas base originales de vez en cuando. Esto permite un acceso mucho más eficiente, a costa de almacenamiento adicional y de que algunos datos puedan quedar desactualizados. Las vistas materializadas se utilizan especialmente en escenarios de almacenamiento de datos , donde las consultas frecuentes de las tablas base reales pueden resultar costosas. [ cita requerida ]
En una vista materializada, se pueden crear índices en cualquier columna. Por el contrario, en una vista normal, normalmente solo es posible explotar índices en columnas que provienen directamente de (o tienen una asignación a) columnas indexadas en las tablas base; a menudo, esta funcionalidad no se ofrece en absoluto.
Las vistas materializadas fueron implementadas por primera vez por Oracle Database : la función de reescritura de consultas se agregó a partir de la versión 8i. [6]
Ejemplo de sintaxis para crear una vista materializada en Oracle:
CREAR VISTA MATERIALIZADA MV_MY_VIEW ACTUALIZAR INICIO RÁPIDO CON SYSDATE SIGUIENTE SYSDATE + 1 COMO SELECCIONAR * DESDE < nombre_tabla > ;
En PostgreSQL , la versión 9.3 y posteriores admiten de forma nativa vistas materializadas. [7] En la versión 9.3, una vista materializada no se actualiza automáticamente y se completa solo en el momento de la creación (a menos que WITH NO DATA
se utilice). Se puede actualizar más tarde de forma manual utilizando REFRESH MATERIALIZED VIEW
. [8] En la versión 9.4, la actualización puede ser simultánea con las selecciones en la vista materializada si CONCURRENTLY
se utiliza . [9]
Ejemplo de sintaxis para crear una vista materializada en PostgreSQL:
CREAR VISTA MATERIALIZADA MV_MY_VIEW [ CON ( parámetro_de_almacenamiento [ = valor ] [, ... ]) ] [ ESPACIO_DE_TABLA nombre_de_espacio_de_tabla ] COMO SELECCIONAR * DE < nombre_de_tabla > ;
Microsoft SQL Server se diferencia de otros RDBMS en la forma de implementar vistas materializadas a través de un concepto conocido como "Vistas Indexadas". La principal diferencia es que dichas vistas no requieren un refresco porque de hecho siempre están sincronizadas con los datos originales de las tablas que componen la vista. Para lograr esto, es necesario que las líneas de origen y destino sean "deterministas" en su mapeo, lo que limita los tipos de consultas posibles para realizar esto. Este mecanismo se implementó desde la versión 2000 de SQL Server.
Ejemplo de sintaxis para crear una vista materializada en SQL Server:
CREAR VISTA MV_MY_VIEW CON ENLACE DE ESQUEMA COMO SELECCIONAR COL1 , SUMA ( COL2 ) COMO TOTAL DE < nombre_tabla > AGRUPAR POR COL1 ; IR CREAR ÍNDICE AGRUPADO ÚNICO XV EN MV_MY_VIEW ( COL1 );
Apache Kafka (desde v0.10.2), Apache Spark (desde v2.0), Apache Flink, Kinetica DB , [10] Materialize, [11] y RisingWave [12] admiten vistas materializadas en flujos de datos.
Las vistas materializadas también son compatibles con Sybase SQL Anywhere . [13] En IBM Db2 , se denominan "tablas de consulta materializadas". [14] ClickHouse admite vistas materializadas que se actualizan automáticamente en las fusiones. [15] MySQL no admite vistas materializadas de forma nativa, pero se pueden implementar soluciones alternativas mediante el uso de activadores o procedimientos almacenados [16] o mediante el uso de la aplicación de código abierto Flexviews. [17] Las vistas materializadas se pueden implementar en Amazon DynamoDB mediante eventos de modificación de datos capturados por DynamoDB Streams. Google anunció el 8 de abril de 2020 [18] la disponibilidad de vistas materializadas para BigQuery [19] como una versión beta.
materialización[:] Una técnica un tanto poco sofisticada para implementar operaciones en vistas según la cual (a) la expresión relacional que define la vista se evalúa en el momento en que se invoca la operación, (b) la vista se materializa de ese modo, y (c) la operación en cuestión se ejecuta luego contra la relación así materializada.
vista materializada[:] Término obsoleto para una instantánea. [...] El problema es [...] que (como indica la definición) las instantáneas han llegado a conocerse, al menos en algunos círculos, no como instantáneas en absoluto sino como vistas materializadas. Pero las instantáneas no son vistas; las vistas son virtuales y las instantáneas no lo son, y "vista materializada" es una contradicción en términos (al menos en lo que respecta al modelo). Peor aún, el término no calificado vista a menudo se toma para significar una vista materializada específicamente, y por lo tanto corremos el riesgo de no tener más un buen término para una vista en el sentido original.