materialize()

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

Syntax

materialize(expressão)

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Tipo Necessário Descrição
expression string ✔️ A expressão tabular a ser avaliada e colocada em cache durante a execução da consulta.

Observações

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

  • Para acelerar as consultas que executam cálculos pesados cujos resultados são utilizados várias vezes na consulta.
  • Para avaliar uma expressão tabular apenas uma vez e utilizá-la muitas vezes numa consulta. Normalmente, isto é necessário se a expressão tabular não for determinista. Por exemplo, se a expressão utilizar as rand() funções ou dcount() .

Nota

Materializar tem um limite de tamanho de cache de 5 GB. Este limite é por nó de cluster e é mútuo para todas as consultas em execução em simultâneo. Se uma consulta utilizar materialize() e a cache não conseguir conter mais dados, a consulta abortará com um erro.

Dica

Outra forma de realizar a materialização da expressão tabular é utilizando o hint.materialized sinalizador do operador como operador e operador de partição. Todos partilham uma única cache de materialização.

Dica

  • Envie todos os operadores possíveis que reduzam o conjunto de dados materializado e mantenham a semântica da consulta. Por exemplo, utilize filtros comuns sobre a mesma expressão materializada.
  • Utilize materialize-se com associação ou união quando os operandos têm subconsultas mútuas que podem ser executadas uma vez. Por exemplo, as pernas de fork de associação/união. Veja o exemplo de utilização do operador de associação.
  • A materialização só pode ser utilizada em instruções let se atribuir um nome ao resultado em cache. Veja o exemplo de utilização de instruções let).

Exemplos de melhoria do desempenho de consultas

O exemplo seguinte mostra como materialize() pode ser utilizado para melhorar o desempenho da consulta. A expressão _detailed_data é definida com a materialize() função e, por conseguinte, é 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 Evento
ÁGUAS DO HAVAÍ Waterspout 100 2
LAGO ONTÁRIO Vento de Trovoada Marinha 100 8
GOLFO DO ALASCA Waterspout 100 4
NORTE DO ATLÂNTICO Vento de Trovoada Marinha 95.2127659574468 179
LAKE ERIE Vento de Trovoada Marinha 92.5925925925926 25
E PACIFIC Waterspout 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 seguinte 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 estes valores no conjunto

Esta operação pode ser efetuada com 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:

BDcontar
2578351

Conjunto de resultados 2:

valor
9999998
9999998
9999997

Conjunto de resultados 3:

Soma
15002960543563

Exemplos de utilização de materialização()

Dica

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

Para utilizar a let instrução com um valor que utiliza mais do que uma vez, utilize a função materializar(). Tente emitir todos os operadores possíveis que reduzam o conjunto de dados materializado e continuem a manter a semântica da consulta. Por exemplo, utilize filtros ou apenas colunas necessárias para o projeto.

    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 enviado para a expressão materializar. A consulta só precisa das colunas Timestamp, Text, Resource1e Resource2. Projetar 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 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 ambos os filtros no resultado materializado por uma expressão lógica or , tal como na seguinte consulta. 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))