materialize()

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 Tipo Requerido 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 o dcount() .

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 marca del operador as y el hint.materializedoperador de partición. Todos comparten una sola 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 sobre la misma expresión materializada.
  • Use materializar con unió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
AGUAS DE HAWAII Tromba de agua 100 2
LAKE ONTARIO Viento de tormenta marina 100 8
GOLFO DE ALASKA Tromba de agua 100 4
ATLÁNTICO NORTE Viento de tormenta marina 95.2127659574468 179
LAKE ERIE Viento de tormenta marina 92.5925925925926 25
E PACIFIC Tromba de agua 90 9
LAKE MICHIGAN Viento de tormenta marina 85.1648351648352 155
LAGO HURON Viento de tormenta marina 79.3650793650794 50
GOLFO DE MÉXICO Viento de tormenta marina 71.7504332755633 414
HAWAII Surf alto 70.0218818380744 320

En el ejemplo siguiente se genera un conjunto de números aleatorios y se calcula:

  • Número de valores distintos del conjunto (Dcount)
  • Los tres valores principales del conjunto
  • 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 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, Resource1y 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))