次の 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 TABLE ステートメントをストアド プロシージャに移動して、SAS 内に配置し、SQL オプティマイザーと周囲の実行シェルによって処理されるというペナルティを回避しました。最終的に、これにより TRUNCATE TABLE のパフォーマンスが大幅に向上しました。
LIBNAME
これをステートメントに追加してみてください:
DIRECT_EXE=DELETE
SAS/ACCESS(R) 9.2 for Relational Databases: Referenceによると、
DIRECT_EXE= を使用すると、SAS が結果セット全体を読み取って一度に 1 行ずつ削除するのではなく、SQL の delete ステートメントが DBMS に直接渡されるため、パフォーマンスが大幅に向上します。
通常、ディスクへの書き込みは読み取りよりも遅いため、遅くなる可能性があります。
ドロップ/切り捨てなしでそれを回避する方法については、良い質問です! :)