Fedsql

SAS Viya Optimierung: Implizites Pass-Through mit FedSQL meistern

Simon 8 vistas

Im klassischen SAS©-Ökosystem (v9) ist das Konzept des SQL Pass-Through (implizit oder explizit) bekannt, um Berechnungen an die Datenbank zu delegieren. Mit der Einführung von SAS© Viya und der In-Memory-Engine CAS (Cloud Analytic Services) entwickelt sich dieser Mechanismus weiter.

Es gibt nun zwei Möglichkeiten, SQL in Viya zu verwenden:

  1. Der traditionelle Ansatz: Über die SAS©/ACCESS-Engines in der SPRE-Umgebung (die "klassische" Seite von Viya).

  2. Der moderne Ansatz: Über die Sprache FedSQL, die direkt mit CAS verbunden ist.

Dieser Artikel konzentriert sich auf die zweite Methode: wie FedSQL Ihre Abfragen optimiert, indem es intelligent entscheidet, ob diese in CAS oder direkt in der Quellendatenbank ausgeführt werden sollen.

Die Entwicklung des FedSQL-Verhaltens

Um die aktuelle Optimierung zu verstehen, muss man die Entwicklung der Engine betrachten:

  • In SAS© Viya 3.2 (Die Vergangenheit): Das Standardverhalten war das systematische Laden. Wenn Sie eine nicht im Speicher geladene Oracle- oder PostgreSQL-Tabelle abfragten, lud CAS zuerst die gesamte Tabelle in den Speicher ("on-the-fly loading") und führte dann die Abfrage aus. Dies war funktionsfähig, aber manchmal ressourcenintensiv für einfache Filter.

  • Seit SAS© Viya 3.3 (Die Gegenwart): Das Implizite Pass-Through wurde eingeführt. Wenn die Tabellen nicht geladen sind, versucht CAS, die FedSQL-Abfrage in natives SQL zu übersetzen, sendet sie zur Ausführung und lädt nur das Ergebnis in den Speicher.

Die Erfolgsbedingungen

Damit das Implizite Pass-Through aktiviert wird, müssen mehrere Bedingungen erfüllt sein:

  1. Die Quelltabellen sind nicht bereits in CAS geladen.

  2. Alle abgefragten Tabellen gehören zur selben CASLIB (d.h. derselben Datenbankverbindung).

  3. Die Abfragesyntax ist mit der Zieldatenbank kompatibel (keine proprietären SAS©-Funktionen, die nicht übersetzbar sind).

Analyse anhand eines Beispiels

Verwenden wir die Option _method in PROC FEDSQL, um den Ausführungsplan zu visualisieren und zu verstehen, was unter der Haube geschieht.

Fall 1: Erfolgreiches Pass-Through (Maximale Optimierung)

Stellen wir uns einen Join zwischen zwei Tabellen (film und film_category) vor, die sich in derselben Postgres CASLIB (pg_db1) befinden.

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;
Log-Analyse: Wenn das Pass-Through funktioniert, sehen Sie einen Abschnitt 'Offloaded SQL statement', der die an Postgres gesendete native SQL-Abfrage zeigt, gefolgt von der Notiz:

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

Hier gelangt nur das gefilterte Ergebnis zurück zu CAS.

Fall 2: Das Pass-Through ist nicht möglich (Multi-Quellen)

Wenn wir denselben Join ausführen, die Tabellen jedoch aus zwei verschiedenen Datenbanken (also zwei unterschiedlichen CASLIBs, pg_db1 und pg_db2) stammen.

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;

Log-Analyse: Die Engine kann keine einzelne SQL-Abfrage an zwei verschiedene Server senden. Der Ausführungsplan zeigt an:

SeqScan from PG_DB1.film SeqScan from PG_DB2.film_category

CAS lädt die Tabellen temporär (oder scannt sie sequentiell) und führt den Join (HashJoin oder MergeJoin) selbst im Speicher aus.

Fall 3: Nicht unterstützte SAS©-Funktionen

Die Verwendung von SAS©-spezifischen Funktionen (wie PUT mit einem SAS©-Format) verhindert oft die Übersetzung in ANSI-Standard-SQL.

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;

Ergebnis: Da wir die Kontrolloption requireFullPassThrough aktiviert haben, schlägt die Abfrage absichtlich fehl, anstatt die Daten zurückzuholen:

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

Ohne diese Option hätte CAS die gesamte customer-Tabelle abgerufen, um das Datum lokal zu filtern, was bei großen Datenmengen katastrophal für die Performance sein kann.

Erweiterte Kontrolloptionen

FedSQL bietet zwei leistungsstarke Optionen für den "Query Planner", um dieses Verhalten zu steuern:

  1. requireFullPassThrough: Stoppt die Ausführung, wenn die Abfrage nicht vollständig an die Datenbank delegiert werden kann. Dies ist eine wichtige Sicherheitsmaßnahme, um unbeabsichtigtes Laden großer Datenmengen zu vermeiden.

  2. disablePassThrough: Erzwingt das Laden der Tabellen in CAS zur lokalen Verarbeitung (nützlich, wenn der Datenbankserver überlastet ist, CAS aber leistungsstark ist).

Wichtige Einschränkungen

  • Nur vollständige Abfrage: Der Mechanismus unterstützt derzeit nur das "Full-Query Pass-Through". Das bedeutet, dass die gesamte Abfrage übersetzbar sein muss. Wenn nur ein Teil (wie ein WHERE-Filter) übersetzbar ist, der Rest aber nicht, wird die partielle Optimierung noch nicht angewendet (im Gegensatz zum klassischen SAS©/ACCESS).

  • Datenquellen: Diese Funktionalität wird für Hadoop, Impala, ODBC, Oracle, PostgreSQL, Teradata, Amazon Redshift, DB2 und SAP HANA unterstützt. (Beachten Sie das bemerkenswerte Fehlen von SQL Server in einigen anfänglichen Versionen, abhängig von Ihrer Viya-Version zu überprüfen).

  • Groß-/Kleinschreibung: FedSQL setzt Namen standardmäßig in Großbuchstaben. Für datenbanken, die Groß-/Kleinschreibung beachten (wie Postgres), verwenden Sie doppelte Anführungszeichen (z.B. pg_db1."table").