Performance des requêtes : Lisez dans les pensées de Skynet avec _METHOD

Cet article en deux mots :

Plongez dans le cerveau de l'optimiseur SQL de SAS et découvrez comment Skynet planifie ses requêtes. Grâce à l'option secrète _METHOD, apprenez à décrypter les plans d'exécution, à identifier les goulots d'étranglement comme les tris inutiles et à choisir la meilleure stratégie de jointure pour vos données. Un guide indispensable pour quiconque souhaite hacker ses performances et décrocher la certification SAS 9 Advanced.

Skynet est devenu conscient de lui-même le 29 août à 2h14 du matin. Mais savez-vous à quoi il a pensé exactement à 2h15 ? Il a analysé son propre code pour voir s'il pouvait aller plus vite.

Jusqu'à présent, nous avons écrit des requêtes SQL en supposant que SAS ferait exactement ce que nous voulons. Mais la PROC SQL est têtue. Vous lui donnez l'ordre de lier deux tables, mais c'est l'Optimiseur SQL de SAS qui décide comment il va le faire. Va-t-il les trier d'abord ? Va-t-il utiliser un objet Hash en arrière-plan ? Va-t-il utiliser votre bel indexStructure de données accélérant la lecture des lignes d'une table en ciblant directement les valeurs des colonnes indexées, réduisant ainsi les entrées/sorties disque et le temps de traitement. ou l'ignorer royalement ?

Pour la certification SAS 9 Advanced, vous devez savoir lire le "plan d'exécution" de SAS. Aujourd'hui, nous allons pirater le cerveau de la machine avec une option non documentée mais officiellement testée : _METHOD.

1. Les 3 phases de la pensée de Skynet

Quand vous soumettez une requête SQL, Skynet ne se lance pas tête baissée dans la bataille. Il procède en trois étapes :

  1. La Validation (Parsing) : Il vérifie que votre syntaxe est bonne et que les tables/colonnes existent bien. S'il y a une faute de frappe, il s'arrête ici.
  2. L'Optimisation : C'est la phase magique. SAS génère tous les plans d'attaque possibles pour résoudre votre requête, évalue le coût de chacun (en termes de CPU et de lecture disque), et choisit le chemin le plus rapide.
  3. L'Exécution : Il envoie les Terminators sur le terrain et ramène les résultats.

2. L'option secrète : _METHOD

Comment voir le plan d'attaque choisi lors de la phase 2 ? Il suffit d'ajouter le mot-clé _METHOD juste après l'appel de votre procédure.

1
2
3
4
5
6
proc sql _method;
select c.Modele, a.Arme
from work.cyborgs as c
inner join work.arsenal as a
on c.ID_Arme = a.ID_Arme;
quit;

En lançant ce code, vos résultats s'affichent normalement, mais dans la log, un étrange message en forme d'arbre matriciel apparaît :

Plaintext

1
2
3
4
5
6
7
NOTE: SQL execution methods chosen are:

sqxjmer
sqxsort
sqxsrc( work.cyborgs(alias = c) )
sqxsort
sqxsrc( work.arsenal(alias = a) )

3. Décrypter le code de la Matrice

Ce bloc de texte se lit de bas en haut et de l'intérieur vers l'extérieur (selon l'indentation). L'examen de certification adore vous demander de traduire ces codes barbares (qui commencent tous par sqx). Voici le dictionnaire de traduction de Skynet :

Les opérations de base :

  • sqxsrc (Source) : Skynet fait une lecture séquentielle de la table, ligne par ligne.
  • sqxidx (IndexStructure de données accélérant la lecture des lignes d'une table en ciblant directement les valeurs des colonnes indexées, réduisant ainsi les entrées/sorties disque et le temps de traitement.) : Skynet a décidé d'utiliser un indexStructure de données accélérant la lecture des lignes d'une table en ciblant directement les valeurs des colonnes indexées, réduisant ainsi les entrées/sorties disque et le temps de traitement. pour lire la table ! (Victoire !)
  • sqxsort (Sort) : Skynet trie les données en mémoireGemini said
    Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
    .
  • sqxfil (Filter) : Skynet applique une clause WHERE ou HAVING.

Les techniques de Jointure (Le cœur de l'examen !) :

  • sqxjsl (Join Step-Loop) : La boucle imbriquée. SAS prend la 1ère ligne de la table A, et lit TOUTE la table B pour trouver une correspondance. C'est la méthode de force brute, utilisée pour les toutes petites tables.
  • sqxjmer (Join Merge) : La jointure par fusion. SAS trie (sqxsort) les deux tables au préalable, puis les fusionne comme une fermeture éclair. Très efficace pour les grandes tables.
  • sqxjhsh (Join Hash) : L'arme absolue. SAS charge la plus petite table dans la RAM sous forme d'Objet Hash (comme vu à l'article 13) et fait passer la grande table au travers. Extrêmement rapide, sans aucun tri préalable !

Si l'on reprend notre log au-dessus, que s'est-il passé ? SAS a lu la table Cyborgs (sqxsrc), l'a triée (sqxsort). Puis il a lu la table Arsenal (sqxsrc) et l'a triée (sqxsort). Enfin, il a fusionné les deux (sqxjmer).

4. L'optimiseur basé sur les coûts (Cost-Based Optimizer)

Pourquoi SAS a-t-il choisi un Merge Join (sqxjmer) plutôt qu'un Hash Join (sqxjhsh) ? Parce que l'Optimiseur de SAS calcule des statistiques invisibles. S'il voit que la mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
RAM allouée à votre sessionInstance de connexion active entre un client et le serveur CAS (Cloud Analytic Services), isolant les ressources, les bibliothèques et les traitements d'un utilisateur au sein de SAS Viya. est trop faible pour contenir la table Arsenal en entier, il refusera de faire un Hash Join pour éviter de faire crasher le système. Il choisira donc la sécurité du tri sur le disque dur.

L'astuce de l'ingénieur : Vous pouvez influencer Skynet ! Si vous savez qu'une jointure Hash serait bien plus rapide, vous pouvez forcer SAS à l'envisager en augmentant une option système spécifique à la PROC SQL appelée MAGIC=. (Mais pour la certification, retenez simplement que l'optimiseur fait généralement le meilleur choix en fonction des ressources disponibles à l'instant T).

Conclusion

La commande _METHOD est comme une radiographie de votre code. Elle vous permet de comprendre pourquoi une requête est lente. Si vous voyez une douzaine de sqxsort dans votre log, vous saurez que Skynet passe son temps à trier des données sur le disque dur, et qu'il est peut-être temps de créer un indexStructure de données accélérant la lecture des lignes d'une table en ciblant directement les valeurs des colonnes indexées, réduisant ainsi les entrées/sorties disque et le temps de traitement. (sqxidx) pour l'aider !

Dans notre Article 20, qui sera le grand final de cette série de préparation à la certification, nous allons atteindre le stade ultime de l'évolution du codeur SAS. Si les fonctions natives de SAS ne vous suffisent plus, pourquoi ne pas créer les vôtres ? Nous découvrirons la fascinante PROC FCMPProcédure de création de fonctions et sous-programmes personnalisés réutilisables. Elle permet d'étendre le langage SAS et de partager des logiques métier complexes entre différentes étapes DATA. (SAS Function Compiler).

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.