Compartilhar via


materialize()

Aplica-se a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

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(expressão)

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Digitar Obrigatória 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 várias vezes em uma consulta. Isso geralmente é 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

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á anulada com um erro.

Dica

Outra maneira de executar a materialização da expressão tabular é usando o hint.materialized sinalizador do operador as 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 reduzem o conjunto de dados materializado e mantêm a semântica da consulta. Por exemplo, use filtros comuns sobre a mesma expressão materializada.
  • Use materialize with join ou union quando seus operandos tiverem subconsultas mútuas que podem ser executadas uma vez. Por exemplo, unir/unir pernas de bifurcação. Veja o exemplo de uso do operador join.
  • 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).

Exemplos de melhoria de desempenho de 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
HAWAII WATERS Tromba de água 100 2
LAKE ONTARIO Vento de tempestade marinha 100 8
GOLFO DO ALASCA Tromba de água 100 4
ATLANTIC NORTH Vento de tempestade marinha 95.2127659574468 179
LAGO ERIE Vento de tempestade marinha 92.5925925925926 25
E PACÍFICO Tromba de água 90 9
LAKE MICHIGAN Vento de tempestade marinha 85.1648351648352 155
LAKE HURON Vento de tempestade marinha 79.3650793650794 50
GOLFO DO MÉXICO Vento de tempestade marinha 71.7504332755633 414
HAWAII Ondas gigantes 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 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:

Contagem
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 let instrução com um valor que você usa mais de uma vez, use a função materialize(). Tente enviar 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 ativado Text é mútuo e pode ser enviado para a expressão materialize. A consulta só precisa das 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 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 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 trecho 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))