The Nameless City

何故か製薬やSAS関連のブログ、の予定。

SASのライセンスの上手い使い方、というのが大変むずかしいっぽい。

SASが高い、というお悩みは昔からよく見かけてたんですけど(英語圏で)、相変わらずそこは悩みどころのようです。
ただ、日本の場合、特にライセンスの費用を抑える為に、SASの極めて狭い機能で利用しようと試みて、変な所で悩んでいるような気がします。


SASの会社としては、「○○を入り口に」もっと各ソリューション製品で業務を回してほしいという思いがあるのですが、旧来よりのSASユーザはあんまり業務分野を広げる事に積極的ではない事も多く、また、多くのフリーソフトを活用してローカルかつミニマムなシステムを作る事が多いようです。
OSSではあまりないです。ベクターなどからダウンロードしたフリーのツールみたいなもので作ってる感じです。


ユーザに近いプログラマーは、極めて原始的なスタンドアロンツールを開発する事が多く、海外のように社内でサッサと環境を作る事ナシにExcelファイルで展開というような形が大変多いです。
その為、素のSASの開発プラットフォームを導入しても大した効果が出ません。
ここらへんが悲しい所で、目の前の開発基盤を眺めながら素のSASプログラム書いてたりするって感じなんですよね。
その為、全然ソリューション製品への導入になってません。


日本の場合、ソリューション製品というのは、おそろしく面倒臭い導入工程を経るというのが一般的になってしまってますが、
もう少しエンドユーザに権限を持たせて、自由度上げてあげたらいいのにとは思います。
・・・・・・システム作るの面白いですよ。


でですね、SASのライセンスはそういう文化の違いを認識していない組み合わせなので、どうしても「ある機能しか使わない」という事には弱いんですよ。
サービスメニューもその辺り損をしてます。サービスで何かのライセンス付けても全然使われないんだって。社内にプライベートクラウド作っても、ユーザが自由に試せるサンドボックスではないんです。社内でAWSみたいなセコセコした金払いが発生し、それを上長が予算化しておいて初めて使えるけど、その予算化にはしっかりした説明が必要で、と、かなり悲しい話になります。


この辺り、もう少し詰めて話せればいいんだけどなあ・・・・・・
まあ、大体手遅れの段階で質問されるのよね。

SASデータセットでストレージが圧迫されて困る人へのTips。もう少し深めに。

「○○ではサイズがちょっとだったのに、SASデータセットにすると大きくなる」というのは、あるあるなので。
その予断を地上から消し去りたい。
SASデータセットでストレージが圧迫されて困る人へのTips - The Nameless City

SASの固定長文字列型という所が悪さする事がある。

固定長文字列型の長さとしては1~32767バイトまで定義出来る。他システムで長さを定義しなくていい可変長文字列型のデータをSASに取り込む際には32767バイトに拡張される事がある。

大体はIMPORTプロシージャの設定を見直してほしい。

Technical Support:IMPORTプロシジャでCSVファイルを読み込む際の文字切れを回避する
http://www.sas.com/offices/asiapacific/japan/service/help/pdf/v94/proc.pdf
テキストファイルのインポートの場合に、私はIMPORTプロシージャをまず使わないが。
余談だが、

文字列型で本当に保存するべき項目か考えてほしい。

SASの数値型は倍精度浮動小数点型であり、整数型がないので不安になる事もあるだろうが、有効桁数としては十進数でおおよそ15桁ある。
最悪、二つの変数に分割したとしても、文字型で持つよりは圧倒的に小さい。
また、カーディナル値が低い文字型の変数の場合には、おおよそ分類用の変数なのだから、SASフォーマットを利用する事を考えてほしい。
内部的には数値あるいは文字でコード値を持ち出力時にはラベルを出力する、という事が簡単に出来る(統計プロシージャでも対応している)。
このSASフォーマット、サーバで利用している場合にはちょっと対応が難しい(GUIが認識するように設定するのが結構面倒臭くてまたそれ用のフォルダが固定でサーバで一つなので利用しづらい)が、他の場合には、RDBMSと同様にマスタテーブルを作る事でだいぶマシになる。


SDTMのTerminologyがなんでコード値持って格納するような形式になっていないのかは、正直謎なんだが、コードのテーブルがガンガン変更されると悲惨だから、なのかねえ。でも無駄だと思うんだけど。
そもそもSAS V5のxport形式にする意味がわからんよなあ・・・・・・

ちょっとずつレコードを処理して「試して」から実行してほしい。

特にSASサービスを立てている場合。途中で変なキャンセルとか効かないので。
レコード数を絞るオプションとか色々あるやん?

正規化されたテーブルからビューを作って実行する事を考えてほしい。

SASのデータステップはビューとして置く事が出来る。無論SQLもビューにする事は出来るんだが。

データの根本の所から絞り込みしてほしい。

SAS/ACCESS~の製品は、各製品と連携して絞込や簡単な集計とかは、データベースなどに実行させてSASから取得する事が出来る。
データの移送量を減らすとかなり快適だと思うんだがなあ。

集約すると。

もう少し設計の観点を持って頂くと大変助かる。

SASのライセンスのお話について少し。

ライセンス更新等にまつわる話。

大前提として。
「ライセンスの有効期間中は使えます。ライセンスの有効期間が終わると使えません」ってのがソフトウェアのライセンスなんですってば。
一応、SASでは、「既に入れている場合に関しては、猶予期間・警告期間のフェーズを設けて、イキナリ業務の問題に発展する事はないようにしています」。が、所詮ソフトウェアのログに吐かれるだけなんで、よく見落とされてます。
経験上は、だいたいは一年契約で猶予期間・警告期間それぞれ30日程度の期間があります。但し、評価版の場合には、猶予期間0日、警告期間5日とかありますね。

  • 使用期限
    • ライセンスが切れる日。余談ですが、開始日の設定はありません。
  • 猶予期間
    • 使用期限の後(ライセンス失効後)、ログに警告も出されない状況で使用は出来る期間。日数で設定されてます。SAS Deployment Wizardによるインストールは出来ません。
    • 新規インストールはギリギリやれるとの事ですが。
  • 警告期間
    • 猶予期間後、ログにライセンス切れの警告が表示される期間。日数で設定されてます。この時になって慌てる人がいますが、この時既に契約について動いていないと日本の会社の場合ギリギリになる事が多いです。


繰り返しになりますが、使用期限の時点でライセンスが切れている為、大抵のサポートは受け付けられませんからね。
49516 - Frequently asked questions about SAS® 9.4 software

大学向けライセンスの話。

学校向けのライセンスは、昔よりだいぶ安くなってます。
が、日本の大学ではなぜか研究室単位で個別に買うのがよくあって、結果的に高くなってる事がよくあります。
あと、各部署の予算とか範囲争い、入札要件の無駄にオープンな仕様のせいで、高い買い方をしている事があります。
無駄に古臭い使い方が想定されてたり。てか、SASの新技術とか日本でついていけてる大学人は多分ごく少数しかおらん。


以下愚痴。
「え、X11経由で使うのか」
SAS DMS使うならLinuxのプログラムエディタは使いづらいんだよね。デフォルトでは書いた文字が消えるし」
「しかし、SASデータセットが簡単に参照出来るのは捨てがたい」
「でも、文字コードが面倒なんだよね。LinuxだとEUC-JPがデフォルトだし、UTF-8も対応してないって出るし」
「そろそろSAS Studioでやってほしい。SAS DMSは化石。」
「でも余計についているSAS Content Serverがデータバカバカ入れられそうでつらそうなんだよなあ。中でVMWare vFavric TC-Serverが使われてるし、セキュリティ的に気にする所が増えるし」
「その手の要件詰めてくれなさそうだしねえ」


CENTOSでもインストールは出来るけどね」
「一部RHELの話をCentOSとして読み替える必要がPerformance Tuningあたりで出てくるんだけど、試ししかやってないしなあ」
「そもそもSASが正式にサポートしている訳ではないんだよなあ代替OS」
「個人的には、CENTOSGUIGNOMEとかIMEAnthyもMozcも使えないのがストレス」
Debian系統にはインストール出来ないんだよねえ。SAS University EditionはどのOSでも入るけどVMで突っ込ませてるだけだし」

ViyaもVAも日本では刺さりにくい。

エンドユーザに近い製品にしては、やたらと真面目に表の構造を理解しないといけないという事もあって、この製品は難しいなと思っている。
また、若干統計家も触りやすいであろうViyaについても、これに金を出してもらえるかというと微妙。


というか、まあ、データサイエンティストがイマイチ育つ土壌ではないんだよねえ。
機械学習が使えるとか、いやうんちょい待った方がいいのかも知れない。


GUIでも裏でコードが生成されるしかなり便利なツール、を目指しているSASと大変相性が悪いのが日本のような気がするなあ。
ちょっと前にVAのお客さんの端末でブラウザがメモリエラー吐いていて、「これは厳しいな」と思った記憶がある。
日本ネットワークは結構工夫されてんだけど、個人端末が貧相なんだよなあ。

SAS9.4TS1M4のリリースの案内が今日来るってどういうことなの。

この度、11月22日(米国時間)にSAS 9.4 M4(16w48)が出荷開始となりましたのでお知らせ致します。

メールくれないよりはマシだけどさ。
英語サイトの方では先週にだいぶ対応されているんだけど、何故日本は遅れるのか意味が分からない。
AMOの自動更新機能で気付くようになってるので、もう少し努力しましょうというか本国とちゃんと連携しないと厳しいよホント。
しかももうそのHotfixが出てる状況なんで。

SASデータセットでストレージが圧迫されて困る人へのTips

とりあえずの策

COMPRESSを有効にして保存してみる事をお勧めします。
特に文字データが多い場合には有効です。固定長文字列を採用している事もあって、SASデータセットは文字データを含んでいると無駄な容量食ってる事が多いです。
暇なら、固定長文字列の長さの妥当性もチェックしてみるのをオススメします。

次くらいの策

作業中のデータセットを無駄に永続化していないか確認しましょう。
SASでのデータ加工は、作業中のデータセットを何個も作りつつ実施する事が多いです。まあプログラムの作り上、インタプリタ言語という特性もあって、ありがちなのですが。
特に、過去の資産の中にその手のゴミを放置しておくと、いつまで経っても放置されっぱなしになるので、整理する際に消してしまうのも手です。
SASのビューを使ってみるのも一つの手です。

本質的な策

データセットの設計を見直し、正規化標準化マスタ利用等考えて下さい。
しばしば、特に必要のない項目をそのままなんとなく保存しているケースを見る事があります。
見るための帳票とデータセットが分離せず、ビューをそのまんまデータとしているようなデータセットは、容量の無駄が相当あります。
まあ、ここら辺になってくると、スキルとかの問題が発生するんですが・・・・・・しばしば他言語での開発でも、「Webの見た目そのまんまのデータを作ってしまう」パターン。
ただ、そう言いつつ今までその手の人を排除出来た試しがなく、スキルでは見抜きづらいところもあります。テストとかで「やる能力がある」のは確認出来ても、「そういう行為を自然と行えるか」という事とは違うんですよね。ついつい、「短時間で物が作れるか」を判定しがちです。パフォーマンスの観点も入れるとちょっとは変わるんですが、大きな課題のパフォーマンスの観点は、ナカナカ短時間のハック見てても分からないです。


SDTMも無駄多いんすよねえ・・・・・・

何故かSAS Deployment Wizardで、.net framework 3.5 SP 1がインストールされない場合がある。

48410 - Attempts to enable .NET Framework 3.5 in Windows 8 Pro, Windows 8 Enterprise, and Windows Server 2012 fail
として、対応手順も記載されているのだけど、どうもこれだけでは不具合が解消しない事がある。
あ、 IT logというのは、/InstallMisc/の中に出来るIT~.logというログファイルの事だけど。


この対応手順は、Windowsコンポーネントを追加でインストールする場合の挙動を変更している訳だけど。
よくWSUS環境だとこの辺りについては対応されていないが為に色々面倒な事になるのだが、この変更を行うと、そこはMicrosoftUpdateから取ってきてくれるようになる。っぽい。
んだが、その後、PowerShellだかCmd.exeだかの権限絞り込みで、どうもSAS Deployment Wizardから再実行しても実行出来ないっぽい。
よく分からんし精査していないが、というのも、まあ、ここまで来たら、手で.net framework 3.5の機能を突っ込んだ方が早えよと。


しかし、これ、ネットワークが外に繋げられる場合ならいいんだけど、そうでない場合には、追加インストール用のフォルダを作っておくかメディアがないと無理。
他のコンポーネントは同梱されているのだが、これは出来ないんだろうか。まあ、サーバのコア機能だから無理なのかな。

SASのResponseファイルが文字化けを起こす。

SAS Deployment Wizardを使うと、%userprofile%\AppData\Local\SAS\SASDeploymentWizard の中にいろいろSDWの実行ログができるんだが、その中には、画面からの選択を記憶しておいてくれるResponseファイルというのがあるんだが。


これを使って記録していた情報を再生すると、途中で文字化けが起こります。
SASサーバの再構築がこれでできるかと思ったのに・・・・・・
面倒臭いなあ・・・・・・


記録側のResponseファイルがS-JISで保存されているので、それをUTF-8(BOMはいらんと思うが多分あっても問題はない)で保存すればOK。
というのをSAS9.4TS1M3で確認。生温かいバグですが、テクサポにいつ報告しようかね・・・・・・

HRESULT系のエラーがSASに絡むと大変だよなあという。

頭を悩ませて来た問題ではあるんだけど。
混ざって来てたから一緒の問題だと思い込んでたけど、違うわ・・・・・・


HRESULT 800ac472 from set operations in Excel

Yes, you are getting the VBA_E_IGNORE error that Excel will return when you try to invoke the object model when the property browser is suspended.

HRESULT Codes in Excel interop in C# - Stack Overflow

HRESULT codes that start with 0x800A are internal errors in the application that you are interoperating with. The last 4 digits are the hex code of the internal error. So in your case that's 0xC472 == "Excel error 50290". That gives your user a hundred thousand Google hits. "The file used has this or that problem" gives your user no Google hits, Microsoft does not maintain a mapping of internal error codes to error descriptions and Google doesn't maintain a list of your error descriptions. Use Marshal.GetHRForException() – Hans Passant Jun 5 '14 at 21:04

へえ。

https://support.microsoft.com/ja-jp/kb/820595

オートメーション サーバーとなっている Excel 2002 は、オートメーションのメソッドやプロパティの設定を実行しようとすると、ユーザーの入力処理など Excel が他の処理を行っているかどうか確認するようになりました。ActiveX コントロールなどの外部コンポーネントとの通信の間でイベントを発生させるプログラムの場合、一時的に Excel の準備ができていない状態になることがあり、このときにオートメーションの通信を行うと、Excel は実行時エラーを返します。

Ready プロパティを使用し、アプリケーションの準備ができている場合にだけ処理を実行します。Ready プロパティは Excel 2002 で新しく追加されたプロパティです。

これらの情報は古いが、内部でおそらく同様の状況になってそうだ。


ともかく。
SASのAMOでこの手の問題が発生していて、
Excel2010で確認してみたが、プロパティはある。
ただ、まあ、これに対応しているかどうかは、VSTOアドインの中身をリバースでもせんと分からんから無理だなあ。対応していても、さてReadyに対応してりゃこのエラー吐かなくなるかは分からないし。
HRESULT 800ac472
"ExcelのExceptionなので対応が無理"という訳ではなかろうちうのは普通に思う所ではあるが、
ここらへんの情報を煮詰めて問い詰めないと、多分対応しないんだろうなあ。はあ。

SAS Hot Fix Analysis, Download and Deployment Tool(SASHFADD)に残念感を覚えつつ、FTPを使わずにHotfixを取得する。

うんまあ、一応言っておくと、SASのせいとは言わない。
言わないんだが、もう少しどうにかしてくれてもいい感じはある。

FTPのプロキシ設定を超えるのが、ここんとこ難しい。

ウチのProxyはPACファイル仕様である。そもそも、Windows謹製のFTPがProxyに対応していないのだが。
PuTTYとか使うのがめんどい。

どうするか。

二通り考えられる。

SAS Software DepotのHotfixダウンロード機能を使う
但し、展開している各サイトナンバー毎に落としてくれるような機能ではなく全部落ちる。意外と時間がかかる。FWは通る。初期インストール時はこちら、なのだが、初期ではないインストールではこちらはちょっと違うルートなので自助努力必要。落として来たファイルから、対象の構成用のを選択する必要がある。これ、多分HTTP/HTTPS?なのか、プロキシは問題にならんかった。ただ、このプロキシ周りって以前はプロキシ設定していた気がする。どこかのファイルにプロキシ設定が保存されてんのかなあ(もう端末でアホほど作業しているので確認する気力がない。)
SASHFADDを使いながらダウンロードはブラウザ等を使う
構成に合わせて必要なものをダウンロードする事は出来る。が、あんまり時間変わんねえなあという気はする。ダウンロード用アドオンなどでレジューム機能等が使えはする。他端末で実施する事が可能なのは利点の一つ。

上記方法で何にせよ落ちるんだけど、SAS Software Depotの場合、複数OSパターン落ちてくるんで、Hotfixとして適用出来ないものが混じっている。その場合にはやっぱりダメとか言われるので、何にせよSASHFADDを用いた方が楽。
楽、なんだけどさ・・・・・・

SASHFADDをPuTTYで超えてというのが大変面倒臭い。

別にSつかないFTPでもいいんだが、なんでかよく分からんが上手く乗り越えられる気がしなかった。毎度ながらFTPは会社のFW内では通しにくい。Windowsでは。
Windowsの接続はやっぱり鬼門だなあと思う。Linuxとか大抵http_proxyとかに仕込めば乗り越えられるんだがなあ・・・・・・
でもとりあえずダウンロードまでは出来る事は確認した。

SASHFADDで出来るファイルリストのHTMLをベースに、ダウンロードしても行けると思う。

その場合には、SAS94_HFADD_data.xmlとDeploymentRegistry.txtだけが必要。DeploymentRegistry.txtは作成出来るはずだし、SAS94_HFADD_data.xmlはブラウザ経由で落とせるだろう(FFでは出来た)。
ftpは通らないが、ANALYSIS_SASHFADD_~フォルダは作成され、中のHTMLから、まとめてダウンロードする事も可能。そう、FFならね。
流石に分割ダウンロードまでやると問題あるとは思うけど、まあ出来る方法が沢山あるに越した事はない。

SASの技術情報の場所として、Knowledge Baseはもう少し使われてほしい。

英語翻訳の仕事をしている訳ではないんで、ホント「日本語の情報だせ」とか要望されるのは勘弁。


Knowledge Baseには、おおよそ日本語モノより十倍以上のノウハウがあります。
support.sas.com

というかまあ、日本語ソースがあまりにも貧弱なのですが。
オススメはFocus Areaです。
support.sas.com



日本のSASコミュニティは、SAS Foundation周りのノウハウに情報が固まってますが、その情報も正直、Focus Areaに書かれていたりする情報が多いです。
ただ。
この辺り、Sitemapがちゃんと整備されておらず、ナカナカ目的の情報に到達するのは難しいかも知れません。
Googleでサルベージする方が早いかも。

SASでバグを発見したら・・・・・・

色々とプロジェクトに関わってきていての経験知です。

  • 障害として急ぎ対応される事は稀。
    • 障害の内容によりますが、基本的にクライアントの挙動とかの場合には、修正されてもだいぶ後です。
    • やった事ないですが、Caryへダイレクトアタックかけられる方が対応は早いと思います。ヘルプの間違いはそれで直してもらった。
  • 回避策を練ろう。
    • 最悪、Excelアドインでプログラムぶっこんでとか有り得る。
  • 製品への過度な期待は禁物。
    • 綺麗な製品の使い方をするならば、あんまり障害にはぶち当たらない。
    • 連携によって起こる障害もプログラムで対応出来るような場合じゃないとプログラムを作ってイージーにシステムを組むのは止めた方がいい。
      • データ連携ならともかく、イベント貼りまくってるAMOとかでVBAで構築するのは無茶じゃないかと思う。
      • プログラムでガシガシ作って回避する時には、WindowsでのExcel VBAの権限とかをちょっと練っておく必要はあるかと思う。


イラッと来る事は多々有りますが、海外製品の場合、「直るまで仕様だと言い張る」事がありまして、それはまあそうだなあ(うっかり認めると賠償の問題がありますので)とは思うんですが、流石に、Usage NoteがHotfix出てProblem Noteに昇格した時に、「その取扱はどうなんだ」と思ったりはしました。
ただまあ、その手の隙間でヤクザみたいに押し寄せて来る連中ってのはグローバル企業なら当たり前のような所があり、多分日本のSIerグローバル化出来ないのもそこら辺緩いからなあと思ったりします。


ともかくも、法曹関係は抜きにして、サッサと先に進みたいんだがなと思う今日このごろ。
こういう事のやり取りをしていると、心が死んでく感じがします。
会社としての責任を問うとか、会社としての責任回避とか、もうどうでもいいんだけどどうにかならないのかなあ。そのせいで、「何が分かって何が分からん」のかという話が茫洋とするのがホントやってらんねえ。

SAS社テクニカルサポートを使ってきて、の雑感。

他に代わって質問する事も多々あります。・・・・・・出来れば、「SASテクニカルサポートにお願い出来ない事をこちらに聞かないでほしい」とか思うんだけど。だいぶ病んでます。

SASテクニカルサポートは、運用面でのサポートは引き受けないのが原則。

あそこは、製品のサポートです。
SASは売る時にはカスタマイズ「出来る」と言うんですが、カスタマイズした設定が正しいとか間違ってるとかは、「マニュアル読んで」としか言いません。

Windows等の他の製品の機能については、サポート外です。

OSの機能絡みに関しては、「Microsoftがサポートですよね」と言われます。

ガチな障害であれば、二週間くらいは最低でもかかる&回避策を飛ばす事もある。

障害を見つけてしまうと、・・・・・・Caryの本社に問い合わせが流れていくんですよね・・・・・・

あくまで原則、なんですが。

SASテクニカルサポートでも、誰に当たるかで回答の方向性が異なる事は多々有ります。
「MSのエラーコードをAMOが拾っているのであって、MSのサポートに確認して下さい」みたいな人と、
「本国に調査を依頼します」みたいな人がいます。
実は両者同じような対応だという事だったりしますが。前者の方が冷たいようですが、実は結構踏み込んで答えてもらっている所でもあります。まずこのパターン、解決不能あるいはパッチが出るパターンです。障害かどうかと言われると、MSの製品のせいもあるかもですしSASの場合もなくはないです。
プログラム開発や保守をしている訳ではないので、SAS Japanで何か解決用のパッチを出せる訳でもない。


回避策を、という場合でも、業務側が考えて回避する事が一番ラクなので、あんまりサポートで対応すべきとも思えないんですよね。
開発のメインルートだと、流石にSASも検証してます。あまり綺麗でない使い方、あるいは、Excelだとマクロ記録してカスタマイズ、みたいなやり方でしている使い方、なんかは、システム開発屋からは見えづらいので、いつまでもバグが残ったりします。
ちょっと綺麗に書くだけでバグってる部分回避出来たりするんだけどー、という所を、頑張っても互いに不幸になるだけだ、とは思います。


あと、SASのソリューション製品の環境を妙にカスタマイズすることは、全くオススメしません。
インストールのオプションの範疇ならわりと分かりやすいですし出来るんですが、アレ、WebServerだとかWebAppServerだとかWebDAVだとかで出来る膨大なパラメータのうち、比較的カンタンに理解されやすい部分だけを抽出しているだけです。
JVMのサイズだとかCacheサイズだとかもぜーんぶ一から設定する事は不可能とは言いませんが、SASがその設定のマニュアルを持っていません(OEMのマニュアルはあるんですがそれもApacheベースとかだとかそういう感じ)し、まるっと売ってるのはそこら辺を自力で構築すると大変面倒だからです。
本来、「/Config/Lev1」とかの下は触るものではない、という風には言われています。


で、このあたりを深掘りして完全なサポートするのは、正直どこの世界に言っても無理じゃないでしょうか。
事前に何が起こるのかとかを設定変更した場合に予測は不可能なんで、故にドライランとか別環境とか持っているものなんですよねえ。
はあ。

とりあえずErlangでもかじってみるか・・・・・・

Pythonはともかくとして。

理由:なんとなく、統計計算に便利そうだから。

統計計算には、意外と行列計算的なものが多く、また、sumとか延々とやるので。
簡単に並列計算風に出来そうだから。

本当はスパコン使ったプログラミングとかやりたいがなあ。

そうも言ってられない。

ElixirはErlangの後かな。

元々、大してオブジェクト指向型やってないのでというのもあり。

レコード件数を取り出す「if 0 then set <dataset name> NOBS=<variable>」は、特定条件下で想定外の結果を返すので注意。

「if 0 then set 」って昔調べた時には情報ホント無かったんだけど、今SASプログラマの人がボチボチネットに書いてますね。
で、見てた時に、そういや某所でやってた時に、ここら辺で面倒臭い話あったなと思い出して調べてみた所、やっぱりこのコードは特定条件下でバグになります。まあ普通はならんのですけど。

参考までに、関係しそうな所に対してリンク貼っときます。TB打てないんだよなはてなブログ
データステップ100万回      SAS新手一生: 【訂正追補】SASデータセットのオブザベーション数をマクロ変数に格納する方法_call symput
SAS忘備録: データステップ内で、色々なデータセットのオブザベーション数を取得する
SAS忘備録: 行削除の落とし穴

通常の使い方。

プログラムは↓

data _NULL_ ;
	if 0 then set SASHELP.CLASS nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;

で、ログが↓

66   data _NULL_ ;
67       if 0 then set SASHELP.CLASS nobs=_SYS_OBS ;
68       put 'トータルの物理オブザベーション数->' _SYS_OBS ;
69       stop ;
70   run ;

トータルの物理オブザベーション数->19
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.00 秒

簡単に説明すると、最初、定義とかは取りに行くんですが、実行部分で「if 0 then」となっているので、レコード自体は読み込まれません。
この場合に、通常はdataステップはオブザベーション数分実行されるんですが、1行も読み込まない設定の場合には、1回だけ実行されます。
データの定義部に、オブザベーション数が書き込まれてるんですね。
で、「トータルの」と但し書きを入れたのは、例えば「set SASHELP.CLASS SASHELP.CLASS」とかにすると、この合算のオブザベーション数(38)が書き込まれます。


本題にも関わってくるのですが、このデータの定義部に書かれているオブザベーション数は、「物理オブザベーション数」であり、「論理オブザベーション数」ではないという事を頭に入れておいて下さい。

特殊条件下で想定外の結果を返す例。

プログラムは以下です。

proc sql ;
	create table CLASSDEL as select * from SASHELP.CLASS ;
	delete * from CLASSDEL where AGE=15 ;
quit ;

data _NULL_ ;
	if 0 then set CLASSDEL nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;

SASHELP.CLASSを複写したCLASSDELというデータセットを作成します。
そして、「SQLプロシージャで」DELETE文を発行しています。この場合、AGE=15(4オブザベーション)を削除します(ホントどうでもいい事ですが、CLASSデータセットは日本語版、UTF-8英語版などでNAMEやSEXの中の値が変わるためAGEにしてます)
その結果は?

71   proc sql ;
72       create table CLASSDEL as select * from SASHELP.CLASS ;
NOTE: テーブルWORK.CLASSDEL(行数19、列数5)が作成されました。

73       delete * from CLASSDEL where AGE=15 ;
NOTE: 4行がWORK.CLASSDELから削除されました。

74   quit ;
NOTE: PROCEDURE SQL処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


75
76   data _NULL_ ;
77       if 0 then set CLASSDEL nobs=_SYS_OBS ;
78       put 'トータルの物理オブザベーション数->' _SYS_OBS ;
79       stop ;
80   run ;

トータルの物理オブザベーション数->19
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.00 秒

さてと。
「このデータの定義部に書かれているオブザベーション数は、「物理オブザベーション数」であり、「論理オブザベーション数」ではない」と言っていた事に繋がるのですが、SQLプロシージャでDELETE文を発行した場合、オブザベーションがまるっと消されるのではなく、単にDELフラグが立つだけです。
そしてこの際定義部は書き換えられないです。
その為、こうなります。

同様の操作をdataステップで実行する事は可能です。但し、MODIFYなんて、まあ滅多に使わないと思いますが。

data CLASSDEL ;
	set SASHELP.CLASS ;
run ;
data CLASSDEL ;
	modify CLASSDEL ;
	if AGE=15 then remove ;
run ;
data _NULL_ ;
	if 0 then set CLASSDEL nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;
308  data CLASSDEL ;
309      set SASHELP.CLASS ;
310  run ;

NOTE: データセットSASHELP.CLASSから19オブザベーションを読み込みました。
NOTE: データセットWORK.CLASSDELは19オブザベーション、5変数です。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


311  data CLASSDEL ;
312      modify CLASSDEL ;
313      if AGE=15 then remove ;
314  run ;

NOTE: データセットWORK.CLASSDELから19オブザベーションを読み込みました。
NOTE: データセットWORK.CLASSDELを更新しました。
 オブザベーションの再書き込み0、追加0、削除4
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.01 秒


315  data _NULL_ ;
316      if 0 then set CLASSDEL nobs=_SYS_OBS ;
317      put 'トータルの物理オブザベーション数->' _SYS_OBS ;
318      stop ;
319  run ;

トータルの物理オブザベーション数->19
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.00 秒


現在、「SQLプロシージャでDELETEステートメントを発行する」「DATAステップでREMOVEステートメントを発行する(MODYFYステートメントでデータセットを取り込む場合)」場合に、「物理オブザベーション数が論理オブザベーション数から乖離する」事がわかっています。

この時他の方法でデータを取得するとどうなっているか?

他に、オブザベーション数を取得する方法は、ざっと考えて二つあります。
CONTENTSプロシージャを利用する方法と、SQLプロシージャでSASHELP.VTABLE(あるいはDICTIONARY.TABLES)を利用する方法です。

proc sql ;
	create table CLASSDEL as select * from SASHELP.CLASS ;
	delete * from CLASSDEL where AGE=15 ;
quit ;
data _NULL_ ;
	if 0 then set CLASSDEL nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;

proc contents data=CLASSDEL out=INFODEL noprint ;
quit ;
proc print data=INFODEL ;
	var MEMNAME NOBS DELOBS ;
quit ;

proc sql ;
	create table INFODEL2 as
	select MEMNAME,NOBS,DELOBS,NLOBS from SASHELP.VTABLE
	where LIBNAME='WORK' and MEMNAME='CLASSDEL' ;
quit ;
proc print data=INFODEL2 ;
	var MEMNAME NOBS DELOBS NLOBS ;
quit ;

今度は、アウトプット(LISTINGで出力)を。

OBS    MEMNAME     NOBS    DELOBS

 1     CLASSDEL     15        4
 2     CLASSDEL     15        4
 3     CLASSDEL     15        4
 4     CLASSDEL     15        4
 5     CLASSDEL     15        4
OBS    memname     nobs    delobs    nlobs

 1     CLASSDEL     19        4        15

CONTENTSプロシージャの出力には変数の情報も入ってくる為その分オブザベーションが増えてしまっているのですが、NOBSは想定のものに「書き換えられている」イメージです。
SQLプロシージャで、SASHELP.VTABLEを利用すると(これは裏でせっせと情報集めに行っているので注意が必要です--対象になるテーブルだけ参照しに行きますが、WHEREの書き方やハンドリング次第ではかなり時間がかかります)、書き換わっていない「NOBS」が表示されます。
DELOBSという変数を表示させていますが、こちらが「削除された(が物理的には残っている)オブザベーション数」になります。
NLOBSはVTABLEにしかありませんが、こちら「論理オブザベーション数」です。

余談

削除されたオブザベーションは、内部的にはデータを保持していますのでバイナリエディタとかで確認出来たりします。
あと、当然ながらパフォーマンス劣化につながります(以前SASサーバのレポジトリ肥大とかあったのはそのせいだろうなあ。今のバージョンでは確認してませんが)。
その場合には、

data <dataset> ;
	set <dataset> ;
run ;

とか書ければ良いのですが。
あと、普段のSAS使いの人はあまり影響ないとは思いますが、Data Integration Studioで、SQLのDELETE文はわりと発行しているので注意です。


ただ、この削除方法等はRDBMSでは見かけるものです。その目的は、マルチアクセスという事にあるわけで、そういや、SAS/SHARE辺りは特に考えてなかったなあ・・・・・・面倒臭い。