Partilhar via


materializar()

Aplica-se a: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Captura o valor de uma expressão tabular para a duração da execução da consulta para que ela possa ser referenciada várias vezes pela consulta sem recálculo.

Sintaxe

materialize( expressão)

Saiba mais sobre convenções de sintaxe.

Parâmetros

Nome Tipo Obrigatório Descrição
expressão string ✔️ A expressão tabular a ser avaliada e armazenada em cache durante a execução da consulta.

Observações

A materialize() função é útil nos seguintes cenários:

  • Para acelerar consultas que executam cálculos pesados cujos resultados são usados várias vezes na consulta.
  • Para avaliar uma expressão tabular apenas uma vez e usá-la muitas vezes em uma consulta. Isso geralmente é necessário se a expressão tabular for não determinística. Por exemplo, se a expressão usa as funções ou as rand()dcount() funções.

Observação

O Materialize tem um limite de tamanho de cache de 5 GB. Esse limite é por nó de cluster e é mútuo para todas as consultas executadas simultaneamente. Se uma consulta for usada materialize() e o cache não puder conter mais dados, a consulta será abortada com um erro.

Sugestão

  • Outra maneira de realizar a materialização da expressão tabular é usando a hint.materialized bandeira do operador as e do operador de partição. Todos partilham uma única cache de materialização.
  • Empurre todos os operadores possíveis que reduzem o conjunto de dados materializado e mantêm a semântica da consulta. Por exemplo, use filtros comuns em cima da mesma expressão materializada.
  • Use materialize com join ou union quando seus operandos tiverem subconsultas mútuas que podem ser executadas uma vez. Por exemplo, pernas de garfo de junção/união. Veja o exemplo de uso do operador de junção.
  • Materialize só pode ser usado em instruções let se você der um nome ao resultado armazenado em cache. Veja o exemplo de uso de instruções let).

Atenção

Compare suas consultas com e sem materialize() para ver se melhora o desempenho de seus dados e padrões de consulta. Em alguns casos, materialize() pode aumentar o uso de memória sem fornecer ganhos significativos de desempenho, portanto, o teste ajuda você a escolher a melhor abordagem.

Exemplos de melhoria do desempenho da consulta

O exemplo a seguir mostra como materialize() pode ser usado para melhorar o desempenho da consulta. A expressão _detailed_data é definida usando materialize() a função e, portanto, é calculada apenas uma vez.

let _detailed_data = materialize(StormEvents | summarize Events=count() by State, EventType);
_detailed_data
| summarize TotalStateEvents=sum(Events) by State
| join (_detailed_data) on State
| extend EventPercentage = Events*100.0 / TotalStateEvents
| project State, EventType, EventPercentage, Events
| top 10 by EventPercentage

Realização

Estado Tipo de Evento EventPercentage Eventos
ÁGUAS DO HAVAÍ Tromba d'água 100 2
LAGO ONTÁRIO Vento de Trovoada Marinha 100 8
GOLFO DO ALASCA Tromba d'água 100 4
ATLÂNTICO NORTE Vento de Trovoada Marinha 95.2127659574468 179
LAGO ERIE Vento de Trovoada Marinha 92.5925925925926 25
E PACÍFICO Tromba d'água 90 9
LAGO MICHIGAN Vento de Trovoada Marinha 85.1648351648352 155
LAGO HURON Vento de Trovoada Marinha 79.3650793650794 50
GOLFO DO MÉXICO Vento de Trovoada Marinha 71.7504332755633 414
HAVAI Surf Alto 70.0218818380744 320

O exemplo a seguir gera um conjunto de números aleatórios e calcula:

  • Quantos valores distintos no conjunto (Dcount)
  • Os três principais valores do conjunto
  • A soma de todos esses valores no conjunto

Esta operação pode ser feita utilizando lotes e materializar:

let randomSet = 
    materialize(
        range x from 1 to 3000000 step 1
        | project value = rand(10000000));
randomSet | summarize Dcount=dcount(value);
randomSet | top 3 by value;
randomSet | summarize Sum=sum(value)

Conjunto de resultados 1:

Dcount
2578351

Conjunto de resultados 2:

valor
9999998
9999998
9999997

Conjunto de resultados 3:

Soma
15002960543563

Exemplos de utilização de materialize()

Sugestão

Materialize sua coluna no momento da ingestão se a maioria das consultas extrair campos de objetos dinâmicos em milhões de linhas. Nesse cenário, use a visão geral da política de atualização.

Para usar a let instrução com um valor que você usa mais de uma vez, use a função materialize(). Tente empurrar todos os operadores possíveis que reduzirão o conjunto de dados materializado e ainda manter a semântica da consulta. Por exemplo, use filtros ou projete apenas colunas necessárias.

    let materializedData = materialize(Table
    | where Timestamp > ago(1d));
    union (materializedData
    | where Text !has "somestring"
    | summarize dcount(Resource1)), (materializedData
    | where Text !has "somestring"
    | summarize dcount(Resource2))

O filtro é Text mútuo e pode ser empurrado para a expressão materializar. A consulta só precisa das colunas Timestamp, Text, Resource1e Resource2. Projete estas colunas dentro da expressão materializada.

    let materializedData = materialize(Table
    | where Timestamp > ago(1d)
    | where Text !has "somestring"
    | project Timestamp, Resource1, Resource2, Text);
    union (materializedData
    | summarize dcount(Resource1)), (materializedData
    | summarize dcount(Resource2))

Se os filtros não forem idênticos, como na consulta a seguir:

    let materializedData = materialize(Table
    | where Timestamp > ago(1d));
    union (materializedData
    | where Text has "String1"
    | summarize dcount(Resource1)), (materializedData
    | where Text has "String2"
    | summarize dcount(Resource2))

Quando o filtro combinado reduzir drasticamente o resultado materializado, combine ambos os filtros no resultado materializado por uma expressão lógica or como na consulta a seguir. No entanto, mantenha os filtros em cada perna de união para preservar a semântica da consulta.

    let materializedData = materialize(Table
    | where Timestamp > ago(1d)
    | where Text has "String1" or Text has "String2"
    | project Timestamp, Resource1, Resource2, Text);
    union (materializedData
    | where Text has "String1"
    | summarize dcount(Resource1)), (materializedData
    | where Text has "String2"
    | summarize dcount(Resource2))