Les Index SAS : Comment retrouver un rebelle dans une botte de téraoctets

Cet article en deux mots :

Marre des lectures séquentielles qui s'éternisent sur des millions de lignes ? Découvrez comment les index transforment vos performances SAS en ciblant instantanément la donnée recherchée. Entre création technique et règles d'optimisation cruciales pour la certification, apprenez enfin à dompter le Big Data.

Skynet fait face à un problème de Big Data. La base de données work.population_mondiale contient désormais 8 milliards de lignes. Hier, Skynet a cherché à localiser le matricule de John Connor avec une simple clause WHERE. Le problème ? SAS a effectué une lecture séquentielle (Sequential Read). Il a lu la ligne 1, puis la ligne 2, puis la ligne 3... jusqu'à la ligne 8 milliards.

Le temps que la requête aboutisse, John Connor avait déjà déménagé trois fois et détruit deux usines.

Pour la certification SAS 9 Advanced, vous devez savoir comment éviter ces lectures interminables. La solution s'appelle 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.. C'est l'équivalent du sommaire à la fin d'un livre : au lieu de lire tout le livre pour trouver le mot "Terminator", vous regardez l'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., qui vous donne la page exacte. SAS va directement à la bonne adresse physique sur le disque dur.

1. Qu'est-ce qu'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. dans SAS ?

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. n'est pas une nouvelle table de données. C'est un fichier séparé (avec l'extension .sas7bndx) qui accompagne votre table principale (.sas7bdat). Ce fichier contient les valeurs de la variable indexée, triées, et un "pointeur" (une adresse) indiquant où se trouve la ligne complète dans la table principale.

Il existe deux types d'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. :

  • 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. Simple : Basé sur une seule variable (ex: Matricule). Son nom doit obligatoirement être identique au nom de la variable.
  • 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. Composite : Basé sur plusieurs variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. (ex: Ville + Nom). Son nom ne doit correspondre à aucune des variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. de la table.

2. Créer ses 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. : SQL ou DATASETS ?

Il y a deux méthodes principales pour 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..

Méthode 1 : La PROC SQL Très intuitive et rapide à écrire, c'est la méthode que nous privilégions chez Cyberdyne.

1
2
3
4
5
6
7
8
9
/* Création d'un index simple sur le matricule */
proc sql;
create index Matricule on work.population_mondiale(Matricule);
quit;

/* Création d'un index composite pour trouver un nom dans une ville */
proc sql;
create index Localisation on work.population_mondiale(Ville, Nom);
quit;

Méthode 2 : La PROC DATASETS L'avantage de la PROC DATASETS est qu'elle ne lit pas la table de données, elle modifie juste les métadonnéesInformations décrivant les données, les utilisateurs et les ressources dans SAS Viya. Elles assurent la traçabilité, la sécurité et la gouvernance au sein de l'architecture distribuée.. C'est la méthode puriste.

1
2
3
4
5
6
7
proc datasets library=work nolist;
modify population_mondiale;
/* Index simple */
index create Matricule;
/* Index composite */
index create Localisation = (Ville Nom);
quit;

3. Les 3 Règles d'Or : Quand ne SURTOUT PAS utiliser d'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.

C'est ici que l'examen de certification vous attend au tournant. 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. n'est pas une solution magique. Parfois, il ralentit le système, car lire l'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. puis sauter à la ligne correspondante demande deux opérations d'I/O (Input/Output) au disque dur.

Voici les cas où vous devez laisser Skynet faire une lecture séquentielle :

  1. La table est trop petite : Si votre table fait moins de 3 pages 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.
    , SAS mettra plus de temps à ouvrir le fichier d'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. qu'à lire la table en entier.
  2. La variable a une "faible cardinalitéLa cardinalité représente le nombre de valeurs distinctes contenues dans une colonne. Une cardinalité élevée indique une grande diversité de données, influençant le choix des modèles dans CAS." : N'indexez jamais une variable comme le Sexe ou le Statut (ex: Actif/Détruit). Si votre recherche renvoie 50% de la table, l'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. est inutile.
  3. Vous extrayez plus de 15% de la table : C'est la règle empirique de SAS. Si votre clause WHERE s'attend à récupérer plus de 10 à 15% des lignes, une lecture séquentielle sera toujours plus performante. L'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. est fait pour trouver l'aiguille (1%), pas la moitié de la botte de foin.

4. SAS utilise-t-il vraiment mon 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. ? L'option MSGLEVEL=I

Le problème avec SAS, c'est qu'il est têtu. Même si vous créez 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. magnifique, SAS décide tout seul s'il va l'utiliser ou s'il préfère faire une lecture séquentielle en fonction de ses propres calculs internes.

Comment savoir si votre 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. a bien été utilisé lors de l'exécution ? Vous devez modifier le niveau de messagerie dans la log avec l'option MSGLEVEL.

1
2
3
4
5
6
7
/* I pour "Information supplémentaire" (par défaut c'est N) */
options msglevel=i;

proc sql;
select * from work.population_mondiale
where Matricule = 'JC-1984';
quit;

En regardant la log, vous verrez alors apparaître un message glorieux :

INFO: 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. Matricule selected for WHERE clause optimization.

Astuce Certification : Vous pouvez forcer SAS à 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. (même s'il pense que c'est une mauvaise idée) grâce à l'option de table (IDXWHERE=YES). À l'inverse, vous pouvez lui interdire de l'utiliser avec (IDXWHERE=NO).

Conclusion

Skynet n'a plus besoin d'attendre des heures pour trouver ses cibles. Grâce aux 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., les requêtes WHERE sur des millions de lignes répondent en une fraction de seconde.

Mais que faire lorsque l'on a besoin d'optimiser non pas la recherche dans une table, mais les calculs complexes sur des dizaines de variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. différentes au sein d'une même ligne ? C'est ce que nous découvrirons dans l'Article 12, en abordant les redoutables Tableaux multidimensionnels (Arrays).

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.