質問
次のSASコマンドを実行しています。
Proc SQL;
Delete From Server003.CustomerList;
Quit;
8分以上かかります...そのファイルを読むのに数秒しかかからない場合。削除が非常に時間がかかる原因は何ですか、そしてそれをより速くするために私は何ができますか?
(テーブルをドロップすることができないので、すべての行を削除することしかできません)
ありがとう、
ダン
編集:テーブルを切り捨てることもできないようです。
解決
これは通常のSQLではありません。 SASのProc SQLは、TRUNCATEステートメントをサポートしていません。理想的には、のパフォーマンスで何が起こっているのかを理解したい delete from
;しかし、本当に必要なのは機能性が切り捨てられている場合、純粋なSASを常に使用して、SQLを混乱させることはできません。
data Server003.CustomerList;
set Server003.CustomerList (obs=0);
run;
これは、効果的に実行および動作します Truncate
します。データセット/テーブル構造は維持されますが、データを入力できません(OBS =オプションのため)。
他のヒント
このテーブルに外国の鍵を持っている他のテーブルはたくさんありますか?これらのテーブルに外部キー列にインデックスがない場合、SQLが行を削除するのが安全かどうかを判断するにはしばらく時間がかかる可能性があります。列。
また、SAS Proc SQLでは、一般的にSQLコマンドが遅くなることにも言及します。最近、私はプロジェクトを行い、Truncateテーブルステートメントをストアドプロシージャに移動し、SAS内にそれらを置いてSQLオプティマイザーと周囲の実行シェルによって処理されることのペナルティを回避しました。最終的に、これにより、トランケートテーブルのパフォーマンスが大幅に向上しました。
ディスクの書き込みは通常、読み取りよりも遅いため、遅くなる可能性があります。
ドロップ/切り捨てずにそれを回避する方法については、良い質問です! :)
これをあなたに追加してみてください LIBNAME
声明:
DIRECT_EXE=DELETE
によると リレーショナルデータベースのSAS/アクセス(R)9.2:参照,
SQL削除ステートメントは、SASが結果セット全体を読み取り、一度に1行ずつ削除する代わりに、SQL削除ステートメントがDBMSに直接渡されるため、Direct_Exe =を使用することでパフォーマンスが大幅に向上します。
また、エレガントを考慮することもできます。
proc sql; table libname.tablenameのようなlibname.tablenameを作成します。終了する;
以前のテーブルの同じ名前と同じメタデータを持つ新しいテーブルを作成し、同じ操作で古いテーブルを削除します。