Fedsql

Optimisation SAS Viya : Maîtriser le Pass-Through Implicite avec FedSQL

Simon 15 views
Niveau de difficulté
Débutant
Published on :
Michael

Le mot de l'Expert

Par Michael

Le Pass-Through Implicite avec FedSQL est le levier de performance ultime dans SAS Viya : il permet de filtrer et joindre vos données à la source pour ne transférer vers CAS que le strict nécessaire. Ma bonne pratique ? Utilisez systématiquement l'option _method dans votre PROC FEDSQL pour vérifier que la note « fully offloaded » apparaît bien dans votre log, garantissant que votre infrastructure ne sature pas inutilement le réseau.

Dans l'écosystème SAS© classique (v9), le concept de SQL Pass-Through (implicite ou explicite) est bien connu pour déléguer les calculs à la base de données. Avec l'arrivée de SAS© Viya et du moteur in-memory CAS (Cloud Analytic Services), cette mécanique évolue.

Il existe désormais deux façons de faire du SQL dans Viya :

  1. L'approche traditionnelle : Via les moteurs SAS©/ACCESS dans l'environnement SPRE (le côté "classique" de Viya).

  2. L'approche moderne : Via le langage FedSQL connecté directement à CAS.

Cet article se concentre sur cette seconde méthode : comment FedSQL optimise vos requêtes en décidant intelligemment de les exécuter dans CAS ou directement dans la base de données source.

L'Évolution du Comportement FedSQL

Pour comprendre l'optimisation actuelle, il faut regarder l'évolution du moteur :

  • Dans SAS© Viya 3.2 (Le passé) : Le comportement par défaut était le chargement systématique. Si vous interrogiez une table Oracle ou PostgreSQL non chargée en mémoire, CAS chargeait d'abord toute la table en mémoire ("on-the-fly loading"), puis exécutait la requête. C'était fonctionnel mais parfois coûteux en ressources pour de simples filtres.

  • Depuis SAS© Viya 3.3 (Le présent) : Le Pass-Through Implicite a été introduit. Si les tables ne sont pas chargées, CAS tente de traduire la requête FedSQL en SQL natif de la base de données, l'envoie pour exécution, et ne charge que le résultat en mémoire.

Les conditions du succès

Pour que le Pass-Through Implicite s'active, plusieurs conditions doivent être réunies :

  1. Les tables sources ne sont pas déjà chargées en mémoire dans CAS.

  2. Toutes les tables interrogées appartiennent à la même CASLIB (c'est-à-dire la même connexion base de données).

  3. La syntaxe de la requête est compatible avec la base cible (pas de fonctions SAS© propriétaires intraduisibles).

Analyse par l'Exemple

Utilisons l'option _method dans PROC FEDSQL pour visualiser le plan d'exécution et comprendre ce qui se passe sous le capot.

Cas 1 : Le Pass-Through Réussi (Optimisation maximale)

Imaginons une jointure entre deux tables (film et film_category) situées dans la même CASLIB Postgres (pg_db1).

1caslib pg_db1 datasource=(srctype="postgres", ...);
2 
3PROC FEDSQL sessref=mySession _method;
4 create TABLE casuser.myresults{options replace=true} as
5 select film.title, film_category.category_id
6 from pg_db1."film" as film,
7 pg_db1."film_category" as film_category
8 where film.film_id=film_category.film_id and
9 film_category.category_id=1;
10QUIT;
Analyse du Log : Si le Pass-Through fonctionne, vous verrez une section Offloaded SQL statement montrant la requête SQL native envoyée à Postgres, suivie de la note :

NOTE: The SQL statement was fully offloaded to the underlying data source via full pass-through

Ici, seul le résultat filtré remonte vers CAS.

Cas 2 : Le Pass-Through Impossible (Multi-Sources)

Si nous faisons la même jointure, mais que les tables proviennent de deux bases de données différentes (donc deux CASLIBs distinctes, pg_db1 et pg_db2).

1PROC FEDSQL sessref=mySession _method;
2 create TABLE casuser.myresults as
3 select film.title, film_category.category_id
4 from pg_db1."film" as film,
5 pg_db2."film_category" as film_category
6 /* ... suite de la requête ... */
7QUIT;

Analyse du Log : Le moteur ne peut pas envoyer une seule requête SQL à deux serveurs distincts. Le plan d'exécution montrera :

SeqScan from PG_DB1.film SeqScan from PG_DB2.film_category

CAS va charger temporairement les tables (ou les scanner séquentiellement) et effectuer la jointure (HashJoin ou MergeJoin) lui-même en mémoire.

Cas 3 : Fonctions SAS© non supportées

L'utilisation de fonctions spécifiques à SAS© (comme PUT avec un format SAS©) empêche souvent la traduction en SQL standard ANSI.

1/* Utilisation de l'option requireFullPassThrough pour forcer le test */
2PROC FEDSQL sessref=mySession _method cntl=(requireFullPassThrough);
3 create TABLE pg_db1.myresults as
4 select * from pg_db1."customer"
5 where put(create_date,ddmmyy10.)='14/02/2006'; /* Fonction SAS */
6QUIT;

Résultat : Comme nous avons activé l'option de contrôle requireFullPassThrough, la requête va échouer volontairement au lieu de rapatrier les données :

NOTE: Full pass-through to the underlying data source was not possible. Stopping execution.

Sans cette option, CAS aurait rapatrié toute la table customer pour filtrer la date localement, ce qui peut être désastreux en termes de performance sur de gros volumes.

Options de Contrôle Avancées

FedSQL offre deux options puissantes pour le "Query Planner" afin de maîtriser ce comportement :

  1. requireFullPassThrough : Stoppe l'exécution si la requête ne peut pas être entièrement déléguée à la base de données. C'est une sécurité vitale pour éviter les chargements involontaires de données massives.

  2. disablePassThrough : Force le chargement des tables dans CAS pour traitement local (utile si le serveur de base de données est surchargé mais que CAS est puissant).

Limitations à connaître

  • Full Query Only : Actuellement, le mécanisme ne supporte que le "Full-Query Pass-Through". Cela signifie que toute la requête doit être traduisible. Si une partie seulement (comme un filtre WHERE) est traduisible mais pas le reste, l'optimisation partielle n'est pas encore appliquée (contrairement au SAS©/ACCESS classique).

  • Sources de données : Cette fonctionnalité est supportée pour Hadoop, Impala, ODBC, Oracle, PostgreSQL, Teradata, Amazon Redshift, DB2 et SAP HANA. (Notez l'absence notable de SQL Server dans certaines versions initiales, à vérifier selon votre version de Viya).

  • Casse : FedSQL met les noms en majuscules par défaut. Pour les bases sensibles à la casse (comme Postgres), utilisez des guillemets doubles (ex: pg_db1."table").