2009-07-20 18 views
0

Je suis exécutant la commande SAS suivante:Proc SQL Supprimer prend trop longtemps

Proc SQL; 
Delete From Server003.CustomerList; 
Quit; 

qui prend plus de 8 minutes ... quand il ne prend que quelques secondes pour lire ce fichier. Qu'est-ce qui pourrait causer une suppression de prendre si longtemps et que puis-je faire pour le faire aller plus vite?

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

Merci,

Dan

Edit: Je peux aussi apparemment pas tronquer tables.

+0

Quel système de base de données utilisez-vous? – AFHood

Répondre

8

Ce n'est pas un SQL normal. SAS 'Proc SQL ne prend pas en charge l'instruction Truncate. Idéalement, vous voulez comprendre ce qui se passe avec les performances du delete from; mais si ce dont vous avez réellement besoin est une fonctionnalité tronquée, vous pouvez toujours utiliser du SAS pur et ne pas du tout gâcher avec SQL.

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

Ceci fonctionne efficacement et fonctionne comme un Truncate. Il maintient la structure de jeu de données/table mais ne parvient pas à le remplir avec des données (en raison de l'option OBS =).

2

Je voudrais également mentionner qu'en général les commandes SQL s'exécutent plus lentement dans SAS PROC SQL. Récemment, j'ai fait un projet et déplacé les instructions TRUNCATE TABLE dans une procédure stockée pour éviter la pénalité de les avoir à l'intérieur de SAS et être géré par leur SQL Optimizer et le shell d'exécution environnant. En fin de compte, cela a considérablement augmenté les performances du TRUNCATE TABLE.

2

Y at-il beaucoup d'autres tables qui ont des clés étrangères à cette table? Si ces tables n'ont pas d'index sur la ou les colonnes de clé étrangère, cela peut prendre un certain temps pour que SQL détermine s'il est ou non prudent de supprimer les lignes, même si aucune des autres tables n'a de valeur dans la clé étrangère colonne (s).

+0

Même avec les index, cela peut prendre un certain temps si vous en avez beaucoup. Notre table principale a plus de 100 clés étrangères (Hey je n'ai pas conçu cette chose) et il faut beaucoup de temps pour supprimer un seul enregistrement. – HLGEM

1

Cela peut être plus lent car les écritures de disque sont généralement plus lentes que les lectures. Comme pour un moyen de contourner sans laisser tomber/tronquer, bonne question! :)

0

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

DIRECT_EXE=DELETE 

Selon SAS/ACCESS(R) 9.2 for Relational Databases: Reference,

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 en lisant l'ensemble des résultats et en supprimant une ligne à la fois.