Si un job SQL MaxCompute s'exécute plus lentement que prévu, cela provient souvent d'une inadéquation entre le nombre de tâches et les ressources disponibles. L'indice split_size définit la taille des fragments de données créés par MaxCompute pour le traitement parallèle. Chaque fragment correspond à une tâche map ; la taille du fragment détermine donc directement le niveau de parallélisme du job. Ajustez cette valeur pour équilibrer le nombre de tâches et les ressources disponibles : des fragments plus petits génèrent davantage de tâches map pour augmenter le parallélisme, tandis que des fragments plus grands réduisent le nombre de tâches et allègent la charge d'ordonnancement.
SELECT ...
FROM <table_name> /*+split_size(<value_in_mb>)*/
...
La taille de fragment par défaut est de 256 Mo.
Fonctionnement
MaxCompute lit les données d'une table et les divise en fragments de la taille spécifiée. Le nombre de tâches map est approximativement égal à :
map tasks = table data size / split_size
Par exemple, une table de 10 Go avec split_size(256) génère environ 40 tâches map. En réduisant la valeur à split_size(64), vous obtenez environ 160 tâches map, soit un parallélisme quatre fois supérieur.
MaxCompute prend en compte l'indice split_size pour la plupart des tables. Toutefois, si l'optimiseur de requête utilise les propriétés de bucketing d'une table clusterisée, il ignore cet indice.
Ajustement de la taille de fragment
Une inadéquation entre le nombre de tâches et les ressources disponibles figure parmi les causes les plus fréquentes de lenteur des jobs SQL :
Trop de tâches pour les ressources disponibles -- Les tâches s'accumulent en file d'attente pour obtenir des emplacements d'exécution, ce qui accroît la surcharge d'ordonnancement. Le job passe plus de temps à attendre qu'à calculer.
Trop peu de tâches pour les ressources disponibles -- Les ressources restent inactives pendant qu'un petit nombre de tâches traite de gros volumes de données de manière séquentielle. Le job dure plus longtemps que nécessaire.
|
Scénario |
Action |
Raison |
|
Les tâches sont en file d'attente pour les ressources |
Augmentez |
Moins de tâches map réduisent la contention et la surcharge d'ordonnancement |
|
Les ressources sont inactives pendant l'exécution du job |
Diminuez |
Davantage de tâches map s'exécutent en parallèle, améliorant l'utilisation des ressources |
Pour des performances optimales, définissez split_size avec des multiples de 256 Mo (par exemple, 256, 512, 1024).
Exemples
Dans tous les exemples, l'indice est placé immédiatement après le nom de la table dans la clause FROM.
Définissez la taille de fragment sur 1 Mo lors de la lecture de src. Les données de la table src sont divisées en fragments de 1 Mo, chacun étant traité par une tâche map distincte. Pour une table de 10 Go, cela crée environ 10 240 tâches map au lieu des 40 par défaut :
SELECT a.key
FROM src a /*+split_size(1)*/
JOIN src2 b ON a.key = b.key;
Augmentez la taille de fragment à 512 Mo pour réduire le nombre de tâches sur une grande table. Pour une table de 10 Go, cette opération réduit le nombre de tâches de 40 à environ 20 :
SELECT *
FROM large_table /*+split_size(512)*/
WHERE dt = '2024-01-01';
Comportement avec les tables clusterisées et les indices multiples
Tables clusterisées : L'optimiseur de requête ignore l'indice
split_sizepour une table clusterisée s'il utilise les propriétés de bucketing de la table pour l'optimisation.-
Indices multiples sur la même table : Si une requête lit la même table plusieurs fois avec des indices
split_sizedifférents, MaxCompute utilise la valeur la plus petite. Par exemple :split_size(1)etsplit_size(10)sur la même table : MaxCompute utilise1.split_size(1)sur une référence et aucun indice sur une autre : MaxCompute utilise1(et non la valeur par défaut de 256 Mo).
Référence
|
Propriété |
Valeur |
Description |
|
Nom de l'indice |
|
Nom utilisé dans le commentaire d'indice |
|
Syntaxe |
|
Syntaxe de commentaire en ligne placée après le nom de la table |
|
Emplacement |
Après le nom de la table dans une requête |
S'applique à la table spécifique qu'il suit |
|
Unité |
Mo |
La valeur de la taille de fragment est interprétée en mégaoctets |
|
Valeur par défaut |
256 |
Utilisée lorsqu'aucun indice n'est spécifié |
|
Valeurs recommandées |
Multiples de 256 (par exemple, 256, 512, 1024) |
S'aligne sur les limites internes des blocs pour des performances optimales |
|
Résolution des conflits |
Petite valeur parmi tous les indices sur la même table |
S'applique lorsque la même table apparaît plusieurs fois avec des indices différents |