【问题标题】:Dropping a table in SAS在 SAS 中删除表
【发布时间】:2010-10-22 13:18:47
【问题描述】:

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

我有一个程序循环删除大量表,想知道PROC SQL之间是否存在性能差异;和过程数据集;一次删除一个表..

或者如果有其他方法可能???

【问题讨论】:

  • 可以通过操作系统调用删除物理 SAS 表文件(和索引)。我不知道这是如何执行的,但我希望原始文件系统删除是最快的。

标签: sas proc-sql drop-table


【解决方案1】:

如果外包给操作系统是合理的,那可能是最快的。否则,我的不科学观察似乎表明 proc sql 中的 drop table 是最快的。这让我感到惊讶,因为我预计 proc datasets 会最快。

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

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

%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;

【讨论】:

  • 外包给操作系统是什么意思?你的意思是通过 X 命令吗?
  • 是的 - 它确实看起来更快,特别是如果您只是清除整个目录。例如 - 这使用 x 命令删除工作目录中的所有 sas 数据集:%macro osdel;选项 noxwait; %let p=%sysfunc(路径名(WORK,l)); x del "&p.\temp*.sas7bdat"; %修补; %osdel;
  • 更正我之前的评论 - 我的意思是说它会删除工作文件夹中以“temp”开头的所有 sas 数据集(因为这是我在答案中的测试中使用的前缀)。
  • 我可以确认你的结果,cmjohns。 PROC SQL:9-13 秒。过程数据集(个人):11-22 秒。 PROC DATASETS(KILL 选项):20-29 秒。
  • 如另一个答案中所述,您应该真正进行测试。我的猜测是,这些差异不一定与方法/过程有关,而与系统配置和操作系统有关。
【解决方案2】:

我们在讨论表格还是数据集?

Tables 表示数据库表。要快速摆脱这些,使用 proc SQL 传递工具将是最快的。特别是如果您可以连接到数据库一次并删除所有表,然后断开连接。

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

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

【讨论】:

    【解决方案3】:

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

    不推荐使用 X 命令删除。它花了永远

    然后我尝试在数据步中使用系统命令:

    %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*”中的每一个构造一个删除命令并发出命令。

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

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

    【讨论】:

      【解决方案4】:

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

      http://www.sascommunity.org/wiki/PROC_Delete

      【讨论】:

        【解决方案5】:

        就哪个更快而言,不包括非常大的数据,我敢打赌它们之间几乎没有区别。 然而,在处理永久 SAS 数据集时,我更喜欢使用 PROC DATASETS 而不是 PROC SQL,只是因为我觉得使用 SAS 设计的方法而不是 SQL 实现更好地处理永久数据集

        【讨论】:

          【解决方案6】:

          类似命名的临时表的简单解决方案:

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

          proc datasets; delete p1: ; run;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多