Partilhar via


Exibições materializadas

Aplica-se a: ✅Microsoft FabricAzure Data Explorer

As exibições materializadas expõem uma consulta de agregação em uma tabela de origem ou em outra exibição materializada.

As exibições materializadas sempre retornam um resultado atualizado da consulta de agregação (sempre atualizado). Consultar uma exibição materializada é mais eficiente do que executar a agregação diretamente na tabela de origem.

Observação

Por que usar exibições materializadas?

Ao investir recursos (armazenamento de dados, ciclos de CPU em segundo plano) para exibições materializadas de agregações comumente usadas, você obtém os seguintes benefícios:

  • Melhoria de desempenho: consultar uma exibição materializada geralmente tem um desempenho melhor do que consultar a tabela de origem para as mesmas funções de agregação.

  • Atualização: uma consulta de exibição materializada sempre retorna os resultados mais atualizados, independentemente de quando a materialização ocorreu pela última vez. A consulta combina a parte materializada da exibição com os registros na tabela de origem, que ainda não foram materializados (a delta parte), sempre fornecendo os resultados mais atualizados.

  • Redução de custos: consultar uma exibição materializada consome menos recursos do que fazer a agregação na tabela de origem. A política de retenção da tabela de origem pode ser reduzida se apenas a agregação for necessária. Essa configuração reduz os custos de cache quente para a tabela de origem.

Para exemplos de casos de uso, consulte Casos de uso de exibição materializada.

Como funcionam as exibições materializadas

Uma exibição materializada é composta por dois componentes:

  • Uma parte materializada - uma tabela que contém registros agregados da tabela de origem, que já foram processados. Essa tabela sempre contém um único registro por combinação agrupar por da agregação.
  • Um delta - os registros recém-ingeridos na tabela de origem que ainda não foram processados.

A consulta da visualização materializada combina a parte materializada com a parte delta, fornecendo um resultado atualizado da consulta de agregação. O processo de materialização offline ingere novos registros do delta para a tabela materializada e atualiza os registros existentes. Se a interseção entre o delta e a parte materializada for grande e muitos registros exigirem atualizações, isso poderá ter um impacto negativo no processo de materialização. Consulte monitorar exibições materializadas sobre como solucionar essas situações.

Consultas de exibições materializadas

Há 2 maneiras de consultar uma exibição materializada:

  • Consultar a exibição inteira: quando você consulta a exibição materializada por seu nome, da mesma forma que consulta uma tabela, a consulta de exibição materializada combina a parte materializada da exibição com os registros na tabela de origem que ainda não foram materializados (o delta).

    • Consultar a exibição materializada sempre retorna os resultados mais atualizados, com base em todos os registros ingeridos na tabela de origem. Para obter mais informações sobre as partes materializadas versus não materializadas na exibição materializada, consulte como funcionam as exibições materializadas.
    • Essa opção pode não ter o melhor desempenho, pois precisa materializar a peça durante o delta tempo de consulta. O desempenho, nesse caso, depende da idade da exibição e dos filtros aplicados na consulta. A seção do otimizador de consulta de exibição materializada inclui possíveis maneiras de melhorar o desempenho da consulta ao consultar toda a exibição.
  • Consultar apenas a parte materializada: outra maneira de consultar a exibição é usando a materialized_view() função. Essa opção dá suporte à consulta apenas da parte materializada da exibição, especificando a latência máxima que o usuário está disposto a tolerar.

    • Não há garantia de que essa opção retorne os registros mais atualizados, mas deve sempre ter mais desempenho do que consultar a exibição inteira.
    • Essa função é útil para cenários em que você está disposto a sacrificar alguma atualização pelo desempenho, por exemplo, para painéis de telemetria.

Dica

As consultas sobre a parte materializada sempre têm um desempenho melhor do que consultar a exibição inteira. Sempre use a materialized_view() função quando aplicável ao seu caso de uso.

  • As exibições materializadas participam de consultas entre clusters ou bancos de dados, mas não são incluídas em uniões ou pesquisas curinga.

    • Todos os exemplos a seguir incluem exibições materializadas pelo nome ViewName:
    cluster('cluster1').database('db').ViewName
    cluster('cluster1').database('*').ViewName
    database('*').ViewName
    database('DB*').ViewName
    database('*').materialized_view('ViewName')
    database('DB*').materialized_view('ViewName')
    
    • Os exemplos a seguir não incluem registros de exibições materializadas:
    cluster('cluster1').database('db').*
    database('*').View*
    search in (*)
    search * 
    
  • As exibições materializadas participam de consultas entre eventos ou entre bancos de dados, mas não são incluídas em uniões ou pesquisas curinga.

    • Todos os exemplos a seguir incluem exibições materializadas pelo nome ViewName:
    cluster("<serviceURL>").database('db').ViewName
    cluster("<serviceURL>").database('*').ViewName
    database('*').ViewName
    database('DB*').ViewName
    database('*').materialized_view('ViewName')
    database('DB*').materialized_view('ViewName')
    
    • Os exemplos a seguir não incluem registros de exibições materializadas:
    cluster("<serviceURL>").database('db').*
    database('*').View*
    search in (*)
    search * 
    

Otimizador de consulta de exibição materializada

Ao consultar a visualização inteira, a parte materializada é combinada com o tempo de consulta durante o delta tempo. Isso inclui agregar e delta juntá-lo à parte materializada.

  • A consulta de toda a exibição terá um desempenho melhor se a consulta incluir filtros nas chaves group by da consulta de exibição materializada. Veja mais dicas sobre como criar sua exibição materializada, com base em seu padrão de consulta, na seção de dicas de .create materialized-view desempenho.
  • O otimizador de consulta escolhe estratégias de resumo/junção que devem melhorar o desempenho da consulta. Por exemplo, a decisão de embaralhar a consulta deve ser feita com base no número de registros em delta parte. As propriedades de solicitação do cliente a seguir fornecem algum controle sobre as otimizações aplicadas. Você pode testar essas propriedades com suas consultas de exibição materializadas e avaliar seu impacto no desempenho das consultas.
Nome da propriedade de solicitação do cliente Tipo Descrição
materialized_view_query_optimization_costbased_enabled bool Se definido como false, desabilita otimizações de resumo/junção em consultas de exibição materializadas. Usa estratégias padrão. O padrão é true.
materialized_view_shuffle dynamic Forçar o embaralhamento da consulta de exibição materializada e (opcionalmente) fornecer chaves específicas para embaralhar. Confira os exemplos abaixo.

ingestion_time() função no contexto de visões materializadas

ingestion_time() retorna valores nulos, quando usada no contexto de uma exibição materializada, se estiver consultando a exibição inteira. Ao consultar a parte materializada da exibição, o valor retornado depende do tipo de exibição materializada:

  • Em exibições materializadas que incluem uma única arg_max()/arg_min()take_any()/agregação, o ingestion_time() é igual ao ingestion_time() do registro correspondente na tabela de origem.
  • Em todas as outras exibições materializadas, o valor de ingestion_time() é aproximadamente o tempo de materialização (consulte como funcionam as exibições materializadas).

Exemplos

  1. Consulte toda a exibição. Os registros mais recentes na tabela de origem estão incluídos:

    ViewName
    
  2. Consulte apenas a parte materializada da exibição, independentemente de quando ela foi materializada pela última vez.

    materialized_view("ViewName")
    
  3. Consulte toda a visualização e forneça uma "dica" para usar shuffle a estratégia. Os registros mais recentes na tabela de origem estão incluídos:

    • Exemplo #1: embaralhar com base na Id coluna (semelhante ao uso hint.shufflekey=Idde):
    set materialized_view_shuffle = dynamic([{"Name" : "ViewName", "Keys" : [ "Id" ] }]);
    ViewName
    
    • Exemplo #2: embaralhar com base em todas as teclas (semelhante ao uso hint.strategy=shufflede):
    set materialized_view_shuffle = dynamic([{"Name" : "ViewName" }]);
    ViewName
    

Considerações sobre o desempenho

Os principais colaboradores que podem afetar a integridade de uma exibição materializada são:

  • Recursos do cluster: como qualquer outro processo em execução no cluster, as exibições materializadas consomem recursos (CPU, memória) do cluster. Se o cluster estiver sobrecarregado, adicionar exibições materializadas a ele poderá causar uma degradação no desempenho do cluster. Monitore a integridade do cluster usando métricas de integridade do cluster. Atualmente, o dimensionamento automático otimizado não leva em consideração a integridade das exibições materializadas como parte das regras de dimensionamento automático.
    • O processo de materialização é limitado pela quantidade de memória e CPU que pode consumir. Esses limites são definidos e podem ser alterados no grupo de carga de trabalho de exibições materializadas.
  • Sobreposição com dados materializados: durante a materialização, todos os novos registros ingeridos na tabela de origem desde a última materialização (o delta) são processados e materializados na exibição. Quanto maior for a interseção entre novos registros e registros já materializados, pior será o desempenho da visão materializada. Uma exibição materializada funcionará melhor se o número de registros que estão sendo atualizados (por exemplo, na arg_max exibição) for um pequeno subconjunto da tabela de origem. Se todos ou a maioria dos registros de exibição materializados precisarem ser atualizados em cada ciclo de materialização, a exibição materializada poderá não ter um bom desempenho.

  • Taxa de ingestão: não há limites codificados no volume de dados ou na taxa de ingestão na tabela de origem da exibição materializada. No entanto, a taxa de ingestão recomendada para exibições materializadas não é superior a 1 a 2 GB/s. Taxas de ingestão mais altas ainda podem ter um bom desempenho. O desempenho depende do tamanho do banco de dados, dos recursos disponíveis e da quantidade de interseção com os dados existentes.

  • Número de exibições materializadas no cluster: as considerações acima se aplicam a cada exibição materializada individual definida no cluster. Cada exibição consome seus próprios recursos e muitas exibições competem entre si nos recursos disponíveis. Embora não haja limites embutidos em código para o número de exibições materializadas em um cluster, o cluster pode não ser capaz de lidar com todas as exibições materializadas, quando há muitas definidas. A política de capacidade pode ser ajustada se houver mais de uma única exibição materializada no cluster. Aumente o valor de ClusterMinimumConcurrentOperations na política para executar exibições mais materializadas simultaneamente.
  • Definição de exibição materializada: a definição de exibição materializada deve ser definida de acordo com as práticas recomendadas de consulta para obter o melhor desempenho da consulta. Para obter mais informações, consulte dicas de desempenho de comando de criação.

Visualização materializada sobre visualização materializada

Uma exibição materializada pode ser criada sobre outra exibição materializada se a exibição materializada de origem for uma exibição de eliminação de duplicação. Especificamente, a agregação da exibição materializada de origem deve ser take_any(*) para eliminar a duplicação de registros de origem. A segunda exibição materializada pode usar qualquer função de agregação com suporte. Para obter informações específicas sobre como criar uma exibição materializada sobre uma exibição materializada, consulte .create materialized-view comando.

Dica

Ao consultar uma exibição materializada definida sobre outra exibição materializada, recomendamos consultar a parte materializada somente usando a materialized_view() função. A consulta de toda a exibição não é executante quando ambas as exibições não estão totalmente materializadas. Para obter mais informações, consulte consultas de exibições materializadas.