materialize()

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

Sintaxe

materialize(expression)

Saiba mais sobre as 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.

Comentários

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. Normalmente, isso é necessário se a expressão tabular não for determinística. Por exemplo, se a expressão usar as rand() funções ou dcount() .

Observação

Materializar tem um limite de tamanho de cache de 5 GB. Esse limite é por nó de cluster e é mútuo para todas as consultas em execução simultaneamente. Se uma consulta usar materialize() e o cache não puder conter mais dados, a consulta será anulada com um erro.

Dica

Outra maneira de executar a materialização da expressão tabular é usando o hint.materialized sinalizador do operador como e do operador de partição. Todos eles compartilham um único cache de materialização.

Dica

  • Envie por push todos os operadores possíveis que reduzam o conjunto de dados materializado e mantenham a semântica da consulta. Por exemplo, use filtros comuns sobre a mesma expressão materializada.
  • Use materializar com junção ou união quando seus operandos tiverem subconsultas mútuas que podem ser executadas uma vez. Por exemplo, pernas de bifurcação de junção/união. Veja o exemplo de como usar o operador join.
  • Materializar só poderá ser usado em instruções let se você atribuir um nome ao resultado armazenado em cache. Veja o exemplo de como usar instruções let).

Exemplos de melhoria no 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

Saída

Estado EventType EventPercentage Eventos
ÁGUAS DO HAVAÍ Tromba de água 100 2
LAGO ONTÁRIO Vento de Tempestade Marinha 100 8
GOLFO DO ALASCA Tromba de água 100 4
ATLÂNTICO NORTE Vento de Tempestade Marinha 95.2127659574468 179
LAKE ERIE Vento de Tempestade Marinha 92.5925925925926 25
E PACIFIC Tromba de água 90 9
LAGO MICHIGAN Vento de Tempestade Marinha 85.1648351648352 155
LAGO HURON Vento de Tempestade Marinha 79.3650793650794 50
GOLFO DO MÉXICO Vento de Tempestade Marinha 71.7504332755633 414
HAVAÍ 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 no conjunto
  • A soma de todos esses valores no conjunto

Essa operação pode ser feita usando 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:

value
9999998
9999998
9999997

Conjunto de resultados 3:

Somar
15002960543563

Exemplos de uso de materialize()

Dica

Materialize sua coluna no momento da ingestão se a maioria das consultas extrair campos de objetos dinâmicos em milhões de linhas.

Para usar a instrução let com um valor que você usa mais de uma vez, use a função materialize(). Tente enviar por push todos os operadores possíveis que reduzirão o conjunto de dados materializado e ainda manterão 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 em Text é mútuo e pode ser enviado por push para a expressão materializar. A consulta só precisa de colunas Timestamp, Text, Resource1e Resource2. Projete essas 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 seguinte consulta:

    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 reduz drasticamente o resultado materializado, combine os dois filtros no resultado materializado por uma expressão lógica or como na consulta a seguir. No entanto, mantenha os filtros em cada etapa 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))