materialize()
S’applique à : ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Capture la valeur d’une expression tabulaire pendant la durée de l’exécution de la requête afin qu’elle puisse être référencée plusieurs fois par la requête sans recalcul.
Syntaxe
materialize(
expression)
En savoir plus sur les conventions de syntaxe.
Paramètres
Nom | Type | Requise | Description |
---|---|---|---|
expression | string |
✔️ | Expression tabulaire à évaluer et mettre en cache pendant l’exécution de la requête. |
Notes
La materialize()
fonction est utile dans les scénarios suivants :
- Pour accélérer les requêtes qui effectuent des calculs lourds dont les résultats sont utilisés plusieurs fois dans la requête.
- Pour évaluer une expression tabulaire une seule fois et l’utiliser plusieurs fois dans une requête. Cela est généralement nécessaire si l’expression tabulaire n’est pas déterministe. Par exemple, si l’expression utilise les
rand()
fonctions ou lesdcount()
fonctions.
Remarque
Matérialiser a une limite de taille de cache de 5 Go. Cette limite est par nœud de cluster et est mutuelle pour toutes les requêtes exécutées simultanément. Si une requête utilise materialize()
et que le cache ne peut pas contenir plus de données, la requête abandonne avec une erreur.
Conseil
Une autre façon d’effectuer la matérialisation de l’expression tabulaire consiste à utiliser l’indicateur de l’opérateur hint.materialized
en tant qu’opérateur et opérateur de partition. Ils partagent tous un cache de matérialisation unique.
Conseil
- Envoyez (push) tous les opérateurs possibles qui réduisent le jeu de données matérialisé et conservent la sémantique de la requête. Par exemple, utilisez des filtres courants au-dessus de la même expression matérialisée.
- Utilisez matérialiser la jointure ou l’union lorsque leurs opérandes ont des sous-requêtes mutuelles qui peuvent être exécutées une seule fois. Par exemple, jointure/jambes de fourche union. Consultez l’exemple d’utilisation de l’opérateur de jointure.
- Matérialiser ne peut être utilisé que dans les instructions let si vous donnez au résultat mis en cache un nom. Consultez l’exemple d’utilisation d’instructions let).
Exemples d’amélioration des performances des requêtes
L’exemple suivant montre comment materialize()
être utilisé pour améliorer les performances de la requête.
L’expression _detailed_data
est définie à l’aide de materialize()
la fonction et est donc calculée une seule fois.
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
Sortie
État | Type d’événement | EventPercentage | Événements |
---|---|---|---|
EAUX D’HAWAÏ | Trombe marine | 100 | 2 |
LAC ONTARIO | Vent d’orage marin | 100 | 8 |
GOLFE DE L’ALASKA | Trombe marine | 100 | 4 |
ATLANTIQUE NORD | Vent d’orage marin | 95.2127659574468 | 179 |
LAC ÉRIÉ | Vent d’orage marin | 92.5925925925926 | 25 |
E PACIFIC | Trombe marine | 90 | 9 |
LAC MICHIGAN | Vent d’orage marin | 85.1648351648352 | 155 |
LAC HURON | Vent d’orage marin | 79.3650793650794 | 50 |
GOLFE DU MEXIQUE | Vent d’orage marin | 71.7504332755633 | 414 |
HAWAII | Gros swell | 70.0218818380744 | 320 |
L’exemple suivant génère un ensemble de nombres aléatoires et de calculs :
- Nombre de valeurs distinctes dans l’ensemble (
Dcount
) - Les trois premières valeurs de l’ensemble
- Somme de toutes ces valeurs dans l’ensemble
Cette opération peut être effectuée à l’aide de lots et de matérialiser :
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)
Jeu de résultats 1 :
Nombre de Dcount |
---|
2578351 |
Jeu de résultats 2 :
valeur |
---|
9999998 |
9999998 |
9999997 |
Jeu de résultats 3 :
Sum |
---|
15002960543563 |
Exemples d’utilisation de matérialiser()
Conseil
Matérialisez votre colonne au moment de l’ingestion si la plupart de vos requêtes extraient des champs d’objets dynamiques dans des millions de lignes.
Pour utiliser l’instruction let
avec une valeur que vous utilisez plusieurs fois, utilisez la fonction materialize(). Essayez d’envoyer (push) tous les opérateurs possibles qui réduisent le jeu de données matérialisé et conservent toujours la sémantique de la requête. Par exemple, utilisez des filtres ou projet uniquement des colonnes requises.
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))
Le filtre activé Text
est mutuel et peut être envoyé (push) à l’expression matérialisée.
La requête a uniquement besoin de colonnes Timestamp
, Text
, Resource1
et Resource2
. Projetez ces colonnes à l’intérieur de l’expression matérialisée.
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 les filtres ne sont pas identiques, comme dans la requête suivante :
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))
Lorsque le filtre combiné réduit considérablement le résultat matérialisé, combinez les deux filtres sur le résultat matérialisé par une expression logique or
comme dans la requête suivante. Toutefois, conservez les filtres dans chaque jambe union pour conserver la sémantique de la requête.
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))