「WHERE」と「サブセット化IF」の違いを知って使い分けようっていう話です。
Sample data
data test;
length col1-col200 $200.; array ar(*) col:; do i=1 to dim(ar); ar(i) = "abcdefg"; end; do i=1 to 50000; output; end; run; |
サンプルデータから「WHEREステートメント」を使ってオブザベーションを抽出したときの処理時間とCPU時間を見てみます。
data out1; set test; where i<100; run; ログ 処理時間 0.33 秒 ユーザーCPU時間 0.02 秒 システムCPU時間 0.32 秒 |
同様のオブザベーションの抽出を「サブセット化IF」を使って処理時間とCPU時間を見てみます。
data out1; set test; if i<100; run; 処理時間 0.53 秒 ユーザーCPU時間 0.12 秒 システムCPU時間 0.41 秒 |
WHEREステートメントの方が処理時間が短いですね。何故このような違いが起きたのでしょうか。
・実行されるタイミングが違う
WHERE | データを読み込む前に実行される |
サブセット化IF | データを読み込んだ後のデータステップ内で実行される |
WHEREの方が実行されるタイミングが早いんで、処理時間が短くなるというわけですね。
・実行できる環境の違い
WHERE | データステップおよび(ほとんどの)PROCステップで実行できる |
サブセット化IF | データステップでのみ実行できる |
サブセット化IFが効果的な例として、以下記事の例②で紹介しているようなケース。
【サブセット化IF】条件に一致するオブザベーションのみ処理を継続する。
data out2; set dt1; c = a + b; if c >= 10; run; |
この例ではデータステップ内で計算した変数Cをサブセット化IFで使用しています。
WHEREステートメントだと「where c >= 10」と書くことは出来ませんよね(データを読み込む前には、まだ変数Cが導出されていないので)
0 件のコメント:
コメントを投稿