在SAS中删除表

在SAS中删除表,sas,proc-sql,drop-table,Sas,Proc Sql,Drop Table,在SAS中删除表的最有效方法是什么 我有一个循环和删除大量表的程序,我想知道PROC-SQL之间是否存在性能差异;和PROC数据集;一次只放下一张桌子 或者,如果有其他方法,也许???如果外包给操作系统是合理的,那么这可能是最快的。否则,我不科学的观察似乎表明procsql中的drop表速度最快。这让我很惊讶,因为我期望proc数据集最快 在下面的代码中,我创建了4000个虚拟数据集,然后尝试用不同的方法删除它们。第一个是sql,在我的系统上删除文件大约需要11秒 接下来的两个都使用proc数据

在SAS中删除表的最有效方法是什么

我有一个循环和删除大量表的程序,我想知道PROC-SQL之间是否存在性能差异;和PROC数据集;一次只放下一张桌子


或者,如果有其他方法,也许???

如果外包给操作系统是合理的,那么这可能是最快的。否则,我不科学的观察似乎表明
procsql
中的drop表速度最快。这让我很惊讶,因为我期望
proc数据集
最快

在下面的代码中,我创建了4000个虚拟数据集,然后尝试用不同的方法删除它们。第一个是sql,在我的系统上删除文件大约需要11秒

接下来的两个都使用
proc数据集
。首先为每个数据集创建一个delete语句,然后删除。第二个只是发出一个blankkill命令来删除工作目录中的所有内容。(我原以为这项技术是最快的)。两个proc数据集例程都报告删除所有4000个文件大约需要20秒

%macro create;
proc printto log='null';run;
%do i=1 %to 4000;
data temp&i;
x=1;
y="dummy";
output;run;
%end;
proc printto;run;
%mend;

%macro delsql;
proc sql;
%do i=1 %to 4000;
drop table temp&i;
%end;
quit;
%mend;

%macro deldata1;
proc datasets library=work nolist;
   %do i=1 %to 4000;
   delete temp&i.;
   %end;
run;quit;
%mend;

%macro deldata2;
proc datasets library=work kill;
run;quit;
%mend;

option fullstimer;
%create;
%delsql;

%create;
%deldata1;

%create;
%deldata2;

我们讨论的是表格还是数据集

表意味着数据库表。要以一种快速的方式消除这些问题,使用procsqlpass-through工具将是最快的。特别是如果您可以连接到数据库一次并删除所有表,然后断开连接

如果我们讨论SAS中的数据集,我会认为proc sql和proc数据集非常相似。从应用程序的角度来看,它们都经过相同的推导来创建删除文件的系统命令。我从SAS用户组或演示中看到的所有测试都表明,使用一种方法优于另一种方法是边缘的,并且基于许多变量


如果您必须以绝对最快的方式删除数据集/表,那么您可能只需要对其进行测试。SAS的每个安装和设置都不同,足以保证进行测试

我试图摆弄操作系统删除方法

不建议使用X命令删除。这花了一辈子的时间

然后,我在datastep中尝试使用system命令:

%macro delos;
data _null_;
do i=1 to 9;
delcmd="rm -f "!!trim(left(pathname("WORK","L")))!!"/temp"!!trim(left(put(i,4.)))!!"*.sas7*";
rc=system(delcmd);
end;
run;
%mend;
如您所见,我必须将我的删除分为9个单独的删除命令。原因是,我正在使用通配符“*”,而底层操作系统(AIX)将这些通配符扩展为一个列表,然后列表变得太大,无法处理

该程序基本上为九个文件组“temp[1-9]*.sas7*”中的每个文件组构造一个delete命令,并发出该命令

使用cmjohns answer中的create macro函数创建4000个数据表,我可以使用这种方法在5秒钟内删除这些数据表


因此,正如我所料,直接操作系统删除是批量删除的最快方式。

proc delete是另一种解决方案,尽管没有文档记录


就速度而言,排除超大数据,我敢打赌它们之间没有什么区别。
但是,在处理永久性SAS数据集时,我喜欢使用PROC数据集而不是PROC SQL,这仅仅是因为我觉得使用SAS设计的方法来处理永久性数据集更好,而不是使用SQL实现来处理命名类似的临时表:

如果所有表都以相同的前缀开头,例如p1_table1和p1_table2,则以下代码将删除任何以p1开头的表

proc数据集;
删除p1:;

运行

您可以通过操作系统调用删除物理SAS表文件(和索引)。我不知道这是如何执行的,但我认为原始文件系统删除是最快的。你说的外包给操作系统是什么意思?你的意思是通过X命令吗?是的,而且它看起来确实更快,尤其是当你刚刚清除整个目录时。例如-这将使用x命令删除工作目录中的所有sas数据集:%macro osdel;选项等待;%设p=%sysfunc(路径名(WORK,l));x del“&p.\temp*.sas7bdat”;%修补;%奥斯德尔;更正我之前的评论-我的意思是说它会删除工作文件夹中所有以“temp”开头的sas数据集(因为这是我在回答中测试时使用的前缀)。我可以确认你的结果,cmjohns。过程SQL:9-13秒。过程数据集(单个):11-22秒。PROC数据集(KILL选项):20-29秒。正如在另一个答案中提到的,您应该真正进行测试。我的猜测是,这些差异不一定与方法/过程有关,而是与系统配置和操作系统有关。