Question

L'utilisation de la fonctionnalité SQL Passthrough avec SAS présente-t-elle des avantages?

Était-ce utile?

La solution

Bien que cette question soit trop large, je peux fournir une réponse trop large.

Le SQL direct dans SAS vous permet de communiquer directement avec une base de données. Cela devient très avantageux lorsque vous utilisez des fonctions spécifiques à une base de données. Un exemple serait les fonctions statistiques d'Oracle. Vous n'avez pas à vous soucier de la manière dont SAS gérera votre codage ou traduira votre code SQL.

De plus, le fait que le SQL direct nécessite très peu de traitement du côté SAS présente également un avantage. Si vous avez une boîte SAS extrêmement occupée, vous pouvez choisir d’envoyer la logique de traitement directement à la base de données. Cela est possible sans utiliser SQL direct, mais vous disposez d'un degré de contrôle supérieur lorsque vous l'utilisez.

Il ne s’agit en aucun cas d’une liste exhaustive des avantages, mais simplement de quelques avantages de haut niveau à l’utilisation du SQL direct. Si vous avez un cas d'utilisation plus concret, nous pouvons discuter des différences spécifiques entre les techniques de codage.

Autres conseils

PROC SQL essaiera de transmettre autant de logique que possible à la base de données, mais ce n’est pas toujours le cas. L'utilisation de fonctions SAS qui n'ont pas d'équivalent dans la base de données (ou dans le moteur SAS / ACCESS pour la base de données) empêchera de transmettre la requête entière à la base de données. Lorsque la requête n'est pas entièrement transmise à la base de données, les données sont extraites dans SAS et traitées dans cette base. Plus votre code SQL est compliqué, plus il risque d'être traité dans SAS. Voici un cas qui fait une plus grande différence que vous pourriez réaliser.

libname db <database> path=dbserver user=... password=...;
proc sql;
   create table db.new as
   select * from db.largedata where flag=1;
quit;

Ceci va réellement (au moins jusqu’à SAS 9.1.3) extraire toutes les données qui correspondent à flag = 1 vers SAS, puis les réimporter dans la base de données. Si cela fait des millions de rangées, cela ralentit vraiment.

Dans ce cas, le passage explicite serait beaucoup plus rapide.

proc sql;
   connect dbase (server=dbserver user=... password=...);
   execute (create table db.new as
   select * from db.largedata where flag=1) as dbase;
   disconnect dbase;
quit;

J'ai récemment utilisé un exemple utilisant Oracle et une table d'environ 250 000 lignes. Le premier moyen a pris 20 secondes et le second 2 secondes.

Si vous n'utilisez pas l'authentification unique, vous devez importer tous les enregistrements (dont vous avez besoin pour le traitement) de la base de données vers sas. En utilisant l'authentification unique, vous pouvez effectuer certains traitements côté base de données et importer uniquement les enregistrements résultants dans sas. La différence (en termes de temps de traitement et d'utilisation du réseau) peut être minime, voire énorme, en fonction de vos activités.

L'utilisation de la communication pas à pas présente des avantages, mais cela dépend de ce que vous essayez d'accomplir. En général, j'utilise le proc standard SQL sans passerelle lorsque je fais des requêtes. Cependant, je l’ai récemment utilisé pour générer des procs stockés.

proc sql;
    connect to mysql(user = 'xxxxx' pass = 'xxxxx' server = 'localhost');
        execute(set @id = &id.) by mysql;
        execute(select (@lit:=image_text) from quality.links_image_text where image_id = @id) by mysql;
        execute(set @lidx = locate('ninja',@lit)) by mysql;
        execute(set @lidx2 = locate(' ',@lit,@lidx)) by mysql;
        execute(set @lidxd = @lidx2 - @lidx) by mysql;
        execute(set @lf = substr(@lit,@lidx,@lidxd)) by mysql;

        create table asdf as
        select &id. as id, a as ws from connection to mysql
        (select @lf as a)
        ;
    disconnect from mysql;
quit;

Clairement, ce n’est pas quelque chose qui peut être fait en dehors de passerelle (du moins pas que je sache). Donc, tout dépend de ce que vous essayez d'accomplir.

En termes simples, les instructions SQL directes vous permettent de mieux contrôler les éléments envoyés à la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top