質問
SASでテーブルを削除する最も効率的な方法は何ですか?
多数のテーブルをループしてドロップするプログラムがあり、PROC SQLの間にパフォーマンスの違いがあるかどうかを知りたい。およびPROCデータセット。一度に1つのテーブルを削除します。.
または別の方法がある場合は、おそらく???
解決
OSに外部委託するのが合理的である場合、それは最速かもしれません。そうでなければ、私の非科学的な観察結果は、 proc sql
のドロップテーブルが最も速いことを示唆しているようです。 proc datasets
が最速になると予想していたので、これは驚きました。
以下のコードでは、4000個のダミーデータセットを作成し、それらをすべて異なる方法で削除してみます。 1つ目はsqlを使用する方法で、私のシステムではファイルを削除するのに約11秒かかりました。
次の2つは両方とも procデータセット
を使用します。最初は、各データセットに対して削除ステートメントを作成してから削除します。 2番目のコマンドは、ブランケットkillコマンドを発行して、作業ディレクトリ内のすべてを削除します。 (この手法が最速になると予想していました)。両方の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;
他のヒント
OS削除アプローチをいじろうとしました。
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)がこれらをリストに展開しますが、リストが大きすぎて処理できないためです...
このプログラムは、基本的に9つのファイルグループそれぞれについて削除コマンドを作成します" temp [1-9] *。sas7 *"コマンドを発行します。
cmjohns answerのcreate macro関数を使用して4000個のデータテーブルを作成すると、このアプローチを使用してわずか5秒でそれらを削除できます。
だから、オペレーティングシステムの直接削除は、私が予想したように、大量削除を行う最も速い方法です。
テーブルまたはデータセットについて議論していますか?
Tablesはデータベーステーブルを意味します。これらを迅速に取り除くには、proc SQLパススルー機能を使用するのが最速です。具体的には、データベースに一度接続してすべてのテーブルを削除できる場合は、切断します。
SASでデータセットについて議論している場合、proc sqlとprocデータセットは非常に似ていると主張します。アプリケーションの観点からは、両者は同じ控除を経て、ファイルを削除するシステムコマンドを作成します。 SASユーザーグループまたはプレゼンテーションから私が見たすべてのテストでは、あるメソッドを他のメソッドよりも使用することはわずかであり、多くの変数に基づいていることが常に示唆されてきました。
データセット/テーブルをドロップする絶対的な最速の方法が必要な場合は、テストする必要があります。 SASの各インストールとセットアップは、テストを保証するのに十分なほど異なります。
非常に大きなデータを除き、どちらの方が速いかという点では、両者の間にほとんど違いがないと思います。 ただし、永続的なSASデータセットを処理するときは、SQL実装ではなくSAS設計の方法を使用して永続的なデータセットを操作する方が良いと感じるため、PROC SQLではなくPROC DATASETSを使用します
同様の名前の一時テーブルの簡単なソリューション:
すべてのテーブルが同じプレフィックス(たとえばp1_table1とp1_table2)で始まる場合、次のコードはp1で始まるテーブルを削除します
procデータセット。
p1を削除します。
実行;
proc deleteは、文書化されていませんが、別の解決策です。