Question

Je suis en cours d'exécution de la commande SAS suivante:

Proc SQL;
Delete From Server003.CustomerList;
Quit;

Ce qui prend plus de 8 minutes ... quand il ne prend que quelques secondes pour lire ce fichier. Ce qui pourrait être la cause d'une suppression de prendre si longtemps et que puis-je faire pour aller plus vite?

(Je n'ai pas accès à déposer la table, donc je ne peux supprimer toutes les lignes)

Merci,

Dan

Edit: Je peux aussi apparemment pas tronquer tables

.
Était-ce utile?

La solution

Ce n'est pas SQL régulière. SAS Proc SQL ne prend pas en charge l'instruction TRUNCATE. Idéalement, vous voulez de savoir ce qui se passe avec la performance du delete from; mais si ce que vous avez vraiment besoin est une fonctionnalité troncature, vous pouvez toujours utiliser SAS simplement pure et plaisante pas avec SQL du tout.

data Server003.CustomerList;
set Server003.CustomerList (obs=0);
run;

Il effectue de manière efficace et fonctionne comme un Truncate ferait. Il maintient la structure de jeu de données / table, mais ne parvient pas à le remplir avec des données (en raison de l'OBS = option).

Autres conseils

Y at-il beaucoup d'autres tables qui ont des clés étrangères à ce tableau? Si ces tableaux ne sont pas d'index sur la colonne de clé étrangère (s), il pourrait prendre un certain temps pour SQL pour déterminer si oui ou non il est sûr de supprimer les lignes, même si aucune des autres tables a effectivement une valeur dans la clé étrangère colonne (s).

Je voudrais mentionner aussi que, en général, les commandes SQL exécutées plus lente dans SAS PROC SQL. Récemment, je l'ai fait un projet et déplacé les relevés TRUNCATE TABLE dans une procédure stockée pour éviter la peine de les avoir à l'intérieur de SAS et par leur être manipulé Optimiseur SQL et entourant shell d'exécution. En fin de cette augmentation de la performance de la table TRUNCATE sensiblement.

Il est peut-être plus lent, car les écritures sur disque sont généralement plus lents que lit.

En ce qui concerne un moyen de contourner sans tomber / tronquer, bonne question! :)

Essayez d'ajouter ceci à votre déclaration de LIBNAME:

DIRECT_EXE=DELETE 

Selon SAS / ACCÈS (R) 9,2 à bases de données relationnelles: de référence,

  

Performance améliore de manière significative à l'aide DIRECT_EXE =, car l'instruction SQL de suppression est transmis directement au SGBD, au lieu de SAS la lecture du jeu de résultats complet et la suppression d'une ligne à la fois.

Vous pouvez aussi envisager l'élégant:

proc SQL; create table libname.tablename comme libname.tablename; quitter;

Je vais produire une nouvelle table avec le même nom et les mêmes méta-données de votre tableau précédent et supprimer l'ancien dans la même opération.

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