materialize()
Se aplica a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Captura el valor de una expresión tabular durante la ejecución de la consulta para que la consulta pueda hacer referencia varias veces a ella sin recálculo.
Sintaxis
materialize(
expression)
Obtenga más información sobre las convenciones de sintaxis.
Parámetros
Nombre | Type | Obligatorio | Descripción |
---|---|---|---|
expression | string |
✔️ | Expresión tabular que se va a evaluar y almacenar en caché durante la ejecución de la consulta. |
Comentarios
La materialize()
función es útil en los escenarios siguientes:
- Para acelerar las consultas que realizan cálculos pesados cuyos resultados se usan varias veces en la consulta.
- Para evaluar una expresión tabular solo una vez y usarla muchas veces en una consulta. Esto suele ser necesario si la expresión tabular no es determinista. Por ejemplo, si la expresión usa las
rand()
funciones odcount()
.
Nota:
Materialize tiene un límite de tamaño de caché de 5 GB. Este límite es por nodo de clúster y es mutuo para todas las consultas que se ejecutan simultáneamente. Si una consulta usa materialize()
y la memoria caché no puede contener más datos, la consulta se anulará con un error.
Sugerencia
Otra manera de realizar la materialización de la expresión tabular es mediante la hint.materialized
marca del operador as y el operador de partición. Todos comparten una sola memoria caché de materialización.
Sugerencia
- Inserte todos los operadores posibles que reduzcan el conjunto de datos materializado y mantengan la semántica de la consulta. Por ejemplo, use filtros comunes encima de la misma expresión materializada.
- Use materializar con combinación o unión cuando sus operandos tienen subconsultas mutuas que se pueden ejecutar una vez. Por ejemplo, las piernas de bifurcación join/union. Vea el ejemplo de uso del operador join.
- Materialize solo se puede usar en instrucciones let si asigna un nombre al resultado almacenado en caché. Vea el ejemplo de uso de instrucciones let).
Ejemplos de mejora del rendimiento de las consultas
En el ejemplo siguiente se muestra cómo materialize()
se puede usar para mejorar el rendimiento de la consulta.
La expresión _detailed_data
se define mediante materialize()
la función y, por tanto, solo se calcula una 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
Salida
State | EventType | EventPercentage | Eventos |
---|---|---|---|
HAWAII WATERS | Tromba de agua | 100 | 2 |
LAKE ONTARIO | Viento de tormenta marina | 100 | 8 |
GOLFO DE ALASKA | Tromba de agua | 100 | 4 |
ATLANTIC NORTH | Viento de tormenta marina | 95.2127659574468 | 179 |
LAGO ERIE | Viento de tormenta marina | 92.5925925925926 | 25 |
E PACIFIC | Tromba de agua | 90 | 9 |
LAKE MICHIGAN | Viento de tormenta marina | 85.1648351648352 | 155 |
LAKE HURON | Viento de tormenta marina | 79.3650793650794 | 50 |
GOLFO DE MÉXICO | Viento de tormenta marina | 71.7504332755633 | 414 |
HAWAII | High Surf | 70.0218818380744 | 320 |
En el ejemplo siguiente se genera un conjunto de números aleatorios y se calcula:
- Cuántos valores distintos del conjunto (
Dcount
) - Los tres valores principales del conjunto
- La suma de todos estos valores en el conjunto
Esta operación se puede realizar mediante lotes y 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:
Sum |
---|
15002960543563 |
Ejemplos de uso de materialize()
Sugerencia
Materialice la columna en el momento de la ingesta si la mayoría de las consultas extraen campos de objetos dinámicos en millones de filas.
Para usar la let
instrucción con un valor que use más de una vez, use la función materialize(). Intente insertar todos los operadores posibles que reducirán el conjunto de datos materializado y seguirán manteniendo la semántica de la consulta. Por ejemplo, use filtros o proyecto solo las columnas necesarias.
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))
El filtro de Text
es mutuo y se puede insertar en la expresión materialize.
La consulta solo necesita columnas Timestamp
, Text
, Resource1
y Resource2
. Proyecta estas columnas dentro de la expresión 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))
Si los filtros no son idénticos, como en la consulta siguiente:
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))
Cuando el filtro combinado reduce drásticamente el resultado materializado, combine ambos filtros en el resultado materializado por una expresión lógica or
como en la consulta siguiente. Sin embargo, mantenga los filtros en cada segmento de unión para conservar la semántica de la 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))