Vistas materializadas

Las vistas materializadas exponen una consulta de agregación sobre una tabla de origen o sobre otra vista materializada.

Las vistas materializadas siempre devuelven un resultado actualizado de la consulta de agregación (siempre actualizada). La consulta de una vista materializada es más eficaz que ejecutar la agregación directamente sobre la tabla de origen.

Nota

¿Por qué usar vistas materializadas?

Al invertir recursos (almacenamiento de datos, ciclos de CPU en segundo plano) para vistas materializadas de agregaciones usadas habitualmente, se obtienen las siguientes ventajas:

  • Mejora del rendimiento: La consulta de una vista materializada normalmente funciona mejor que consultar la tabla de origen para las mismas funciones de agregación.

  • Frescura: Una consulta de vista materializada siempre devuelve los resultados más actualizados, independientemente de cuándo tuvo lugar la materialización por última vez. La consulta combina la parte materializada de la vista con los registros de la tabla de origen, que aún no se han materializado (la delta parte), siempre proporcionando los resultados más actualizados.

  • Reducción de costos:la consulta de una vista materializada consume menos recursos del clúster que realizar la agregación en la tabla de origen. La directiva de retención de la tabla de origen se puede reducir si solo se requiere la agregación. Esta configuración reduce los costos de caché activa de la tabla de origen.

Para ver casos de uso de ejemplo, consulte Casos de uso de vistas materializadas.

Funcionamiento de las vistas materializadas

Una vista materializada se compone de dos componentes:

  • Una parte materializada : una tabla que contiene registros agregados de la tabla de origen, que ya se han procesado. Esta tabla siempre contiene un único registro por combinación de agrupación por agregación.
  • Delta: los registros recién ingeridos en la tabla de origen que aún no se han procesado.

La consulta de la vista materializada combina la parte materializada con la parte delta, lo que proporciona un resultado actualizado de la consulta de agregación. El proceso de materialización sin conexión ingiere nuevos registros de la diferencia en la tabla materializada y actualiza los registros existentes. Si la intersección entre el delta y la parte materializada es grande y muchos registros requieren actualizaciones, esto podría tener un impacto negativo en el proceso de materialización. Consulte Supervisión de vistas materializadas sobre cómo solucionar estas situaciones.

Consultas de vistas materializadas

Hay dos maneras de consultar una vista materializada:

  • Consultar toda la vista: al consultar la vista materializada por su nombre, de forma similar a consultar una tabla, la consulta de vista materializada combina la parte materializada de la vista con los registros de la tabla de origen que aún no se han materializado ().delta

    • La consulta de la vista materializada siempre devuelve los resultados más actualizados, en función de todos los registros ingeridos en la tabla de origen. Para obtener más información sobre los elementos materializados frente a los no materializados en la vista materializada, vea cómo funcionan las vistas materializadas.
    • Es posible que esta opción no funcione mejor, ya que necesita materializar la parte durante el delta tiempo de consulta. El rendimiento en este caso depende de la antigüedad de la vista y de los filtros aplicados en la consulta. La sección optimizador de consultas de vista materializada incluye posibles formas de mejorar el rendimiento de las consultas al consultar toda la vista.
  • Consultar solo la parte materializada: otra forma de consultar la vista es mediante la materialized_view() función . Esta opción solo admite la consulta de la parte materializada de la vista, al tiempo que especifica la latencia máxima que el usuario está dispuesta a tolerar.

    • Esta opción no está garantizada para devolver los registros más actualizados, pero siempre debe ser más eficaz que consultar toda la vista.
    • Esta función es útil para escenarios en los que está dispuesto a sacrificar cierta actualización para el rendimiento, por ejemplo, para paneles de telemetría.

Sugerencia

Las consultas sobre el elemento materializado solo siempre funcionan mejor que consultar toda la vista. Use siempre la materialized_view() función cuando sea aplicable para su caso de uso.

  • Las vistas materializadas participan en consultas entre clústeres o entre bases de datos, pero no se incluyen en uniones o búsquedas con caracteres comodín.

    • En los ejemplos siguientes se incluyen vistas materializadas por el nombre ViewName:
    cluster('cluster1').database('db').ViewName
    cluster('cluster1').database('*').ViewName
    database('*').ViewName
    database('DB*').ViewName
    database('*').materialized_view('ViewName')
    database('DB*').materialized_view('ViewName')
    
    • En los ejemplos siguientes no se incluyen registros de vistas materializadas:
    cluster('cluster1').database('db').*
    database('*').View*
    search in (*)
    search * 
    

Optimizador de consultas de vista materializada

Al consultar toda la vista, el elemento materializado se combina con durante el delta tiempo de consulta. Esto incluye agregar y delta combinarlo con la parte materializada.

  • La consulta de toda la vista funciona mejor si la consulta incluye filtros en el grupo por claves de la consulta de vista materializada. Consulte más sugerencias sobre cómo crear la vista materializada, en función del patrón de consulta, en la .create materialized-view sección sugerencias de rendimiento.
  • El optimizador de consultas elige estrategias de resumen o combinación que se espera que mejoren el rendimiento de las consultas. Por ejemplo, la decisión sobre si se va a ordenar aleatoriamente la consulta se basa en el número de registros en delta parte. Las siguientes propiedades de solicitud de cliente proporcionan cierto control sobre las optimizaciones aplicadas. Puede probar estas propiedades con las consultas de vista materializadas y evaluar su impacto en el rendimiento de las consultas.
Nombre de propiedad de solicitud de cliente Tipo Descripción
materialized_view_query_optimization_costbased_enabled bool Si se establece falseen , deshabilita las optimizaciones de resumen o combinación en consultas de vista materializadas. Usa estrategias predeterminadas. El valor predeterminado es true.
materialized_view_shuffle dynamic Forzar orden aleatorio de la consulta de vista materializada y, opcionalmente, proporcionar claves específicas por las que se ordena aleatoriamente. Vea los ejemplos siguientes.

Ejemplos

  1. Consulte toda la vista. Se incluyen los registros más recientes de la tabla de origen:

    ViewName
    
  2. Consulte solo la parte materializada de la vista, independientemente de cuándo se materializó por última vez.

    materialized_view("ViewName")
    
  3. Consulte toda la vista y proporcione una "sugerencia" para usar shuffle la estrategia. Se incluyen los registros más recientes de la tabla de origen:

    • Ejemplo 1: orden aleatorio basado en la Id columna (de forma similar a usar hint.shufflekey=Id):
    set materialized_view_shuffle = dynamic([{"Name" : "ViewName", "Keys" : [ "Id" ] }]);
    ViewName
    
    • Ejemplo 2: orden aleatorio basado en todas las claves (de forma similar a usar hint.strategy=shuffle):
    set materialized_view_shuffle = dynamic([{"Name" : "ViewName" }]);
    ViewName
    

Consideraciones de rendimiento

Los principales colaboradores que pueden afectar a un estado de vista materializado son:

  • Recursos de clúster: Al igual que cualquier otro proceso que se ejecute en el clúster, las vistas materializadas consumen recursos (CPU, memoria) del clúster. Si el clúster está sobrecargado, agregar vistas materializadas a él puede provocar una degradación en el rendimiento del clúster. Supervise el estado del clúster mediante métricas de estado del clúster. La escalabilidad automática optimizada actualmente no tiene en cuenta el estado de las vistas materializadas como parte de las reglas de escalado automático.

  • Superposición con datos materializados: Durante la materialización, todos los nuevos registros ingeridos en la tabla de origen desde la última materialización (delta) se procesan y materializan en la vista. Cuanto mayor sea la intersección entre los nuevos registros y los registros ya materializados, peor será el rendimiento de la vista materializada. Una vista materializada funciona mejor si el número de registros que se actualizan (por ejemplo, en arg_max vista) es un pequeño subconjunto de la tabla de origen. Si todos o la mayoría de los registros de vista materializados deben actualizarse en cada ciclo de materialización, es posible que la vista materializada no funcione bien.

  • Tasa de ingesta: No hay límites codificados de forma rígida en el volumen de datos o la tasa de ingesta en la tabla de origen de la vista materializada. Sin embargo, la tasa de ingesta recomendada para las vistas materializadas no es superior a 1 a 2 GB/s. Es posible que las tasas de ingesta más altas sigan funcionando bien. El rendimiento depende del tamaño del clúster, los recursos disponibles y la cantidad de intersección con los datos existentes.

  • Número de vistas materializadas en el clúster: Las consideraciones anteriores se aplican a cada vista materializada individual definida en el clúster. Cada vista consume sus propios recursos y muchas vistas compiten entre sí en los recursos disponibles. Aunque no hay límites codificados de forma rígida en el número de vistas materializadas en un clúster, es posible que el clúster no pueda controlar todas las vistas materializadas, cuando hay muchas definidas. La directiva de capacidad se puede ajustar si hay más de una vista materializada en el clúster. Aumente el valor de ClusterMinimumConcurrentOperations en la directiva para ejecutar vistas más materializadas simultáneamente.

  • Definición de vista materializada: la definición de vista materializada debe definirse según los procedimientos recomendados de consulta para mejorar el rendimiento de las consultas. Para obtener más información, consulte Creación de sugerencias de rendimiento de comandos.

Vista materializada sobre la vista materializada

Se puede crear una vista materializada en otra vista materializada si la vista materializada de origen es una vista de desduplicación. En concreto, la agregación de la vista materializada de origen debe ser take_any(*) para desduplicar registros de origen. La segunda vista materializada puede usar cualquier función de agregación admitida. Para obtener información específica sobre cómo crear una vista materializada sobre una vista materializada, consulte .create materialized-view el comando .

Sugerencia

Al consultar una vista materializada definida sobre otra vista materializada, se recomienda consultar la parte materializada solo mediante la materialized_view() función . La consulta de toda la vista no es eficaz cuando ambas vistas no están totalmente materializadas. Para obtener más información, consulte consultas de vistas materializadas.