前回「SQLビューの作成と落とし穴①」を書いたので、似たような機能のDATAステップビューにも触れておきます。
以下をご覧ください
上で作成した DSVIEW は一見データセットに見えますが、「DATAステップビュー」というものです。
「DATAステップビュー」には、データセットではなく以下が保存されます。
- コンパイルしたDATAステップのプログラム
- 変数の型やLENGTHといった属性情報
このDATAステップビューを開いたり、参照すると、コンパイルしたプログラムが実行されて結果のデータが返ってくる仕組みになっています。
構文
DATA ビュー名 / VIEW = ビュー名; ~ プログラム ~
RUN;
|
ビューの定義を見たい場合は以下のように書きます。
data view=DSVIEW;
describe; run;
ログ
NOTE: DATAステップビューWORK.DSVIEWの定義:
data DSVIEW / view=DSVIEW; set SASHELP.CLASS; keep NAME AGE; run; |
たとえば、DT1というデータセットがあっとして、
以下のようにDT1から変数Cを導出するDATAステップビューを作っておいたとします。
ここでもし、DT1の中身が定期的に更新されて、更新される度に変数Cに対してMEANSを実行しなおしたい場合、、
最初に「変数Cを作るDATAステップビュー」を作ってライブラリに保存しておいたので、
たとえDT1が更新されても、DATAステップビューを参照するMEANSを実行するだけで済みます。
(ビューを参照するだけで、内部で最新のDT1に対してビューに保存されたデータステップのプログラムが実行され、その結果に対してMEANSが実行されるため。)
DATAステップビューの落とし穴
data MYLIB.STAT1 / view=MYLIB.STAT1; set DT1; C = A + B; run; |
この変数Cに対して、MEANSプロシジャを実行したとします。
proc means data=MYLIB.STAT1; var C; run; |
最初に「変数Cを作るDATAステップビュー」を作ってライブラリに保存しておいたので、
たとえDT1が更新されても、DATAステップビューを参照するMEANSを実行するだけで済みます。
(ビューを参照するだけで、内部で最新のDT1に対してビューに保存されたデータステップのプログラムが実行され、その結果に対してMEANSが実行されるため。)
またメリットとして、ビューの中身は定義なのでファイルサイズは小さいです。
ただし、プログラム中に何回も同じ中身のビューを参照するような状況では、参照するたびに内部でデータステップのプログラムが実行される事になるので、処理効率が悪くなります。
ただし、プログラム中に何回も同じ中身のビューを参照するような状況では、参照するたびに内部でデータステップのプログラムが実行される事になるので、処理効率が悪くなります。
DATAステップビューで参照しているデータセットは、途中で変数を増やしたり減らしたり、属性情報(LENGTHや変数ラベル等)を変更したりするのはNGです。
以下の例では、データセットDT2をSETするという単純なDATAステップビューDSVIEW2を作成しています。
data DT2; length X $2.; X = "aa"; run; data DSVIEW2 / view=DSVIEW2; set DT2; run; |
ここで、DT2を以下青文字の通り、作り直してみます(変数XのLENGTHを5に増やして"bbbbb"という値を格納)
そして、このDT2をSETしているDSVIEW2をPROC PRINTで出力してみます。
あれ?Xには "bbbbb" が格納されているはずなのに、"bb"と出力されていて文字切れを起こしている??
「DATAステップビューはデータセットと違い実態がない」という事に起因して、一部のデータセットオプションが効かない事もあるので、動作について検証が必要です。
また、データステップ100万回でSQLビューとDATAステップビューの違いや、注意点についても書かれてるので、合わせてご参照下さい。
・ビューの生成コードを出力するdescribeについて、SQLビューとデータステップビューだと方法が違うから気を付けてって話
0 件のコメント:
コメントを投稿