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 oudcount()
.
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
, Resource1
e 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))
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários