Exibições materializadas
Aplica-se a: ✅Microsoft Fabric✅Azure 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
- Para decidir se as exibições materializadas são adequadas para você, examine os casos de uso de exibições materializadas.
- As exibições materializadas têm algumas limitações. Antes de trabalhar com o recurso, revise as considerações de desempenho.
- Considere o uso de políticas de atualização quando apropriado. Para obter mais informações, consulte Exibições materializadas versus políticas de atualização.
- Monitore a integridade de suas exibições materializadas com base nas recomendações em Monitorar exibições materializadas.
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 *
- Todos os exemplos a seguir incluem exibições materializadas pelo nome
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 *
- Todos os exemplos a seguir incluem exibições materializadas pelo nome
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, oingestion_time()
é igual aoingestion_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
Consulte toda a exibição. Os registros mais recentes na tabela de origem estão incluídos:
ViewName
Consulte apenas a parte materializada da exibição, independentemente de quando ela foi materializada pela última vez.
materialized_view("ViewName")
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 usohint.shufflekey=Id
de):
set materialized_view_shuffle = dynamic([{"Name" : "ViewName", "Keys" : [ "Id" ] }]); ViewName
- Exemplo #2: embaralhar com base em todas as teclas (semelhante ao uso
hint.strategy=shuffle
de):
set materialized_view_shuffle = dynamic([{"Name" : "ViewName" }]); ViewName
- Exemplo #1: embaralhar com base na
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.