スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SASのインデックスに関して

SASのインデックスに関するまとめ


■質問1
1.単一インデックスと複合インデックスの違い
 単一インデックスの違いと、複合インデックスの違いは?
 また、それぞれのメリット、デメリットは?

■回答1
単一インデックスは1つの変数に対して作成されるインデックスです。この時インデックス名は変数名と同一である必要があります。複合インデックスは複数の変数名に対して定義されるインデックスになります。複合インデックスの名前は変数名とは別の名前を定義します。

単一インデックスはSQL文が以下のいずれかの条件を満たした場合に使用されます。

1. 比較演算子を使用している
例)
where year > 2000;

2. 比較演算子の否定を使用している
例)
where actual ^> predict;

3. CONTAINS演算子を使用している
例)
where state contains 'North';

4. コロンモディファイアを使用した比較演算を使用している
例)
where state =: 'North';

5. TRIM関数を使用している
例)
where trim(state) = 'North Carolina';

6. BETWEEN演算子やAND演算子、比較演算子を使用して範囲指定をしている
例)
where 1999 < year < 2005;
where year between 1999 and 2005;

7. 「LIKE」、「NOT LIKE」演算子を使用している
例)
where sate like 'North %';
where country like '%Republic%';

8. IS MISSING、IS NULL演算子を使用している
例)
where county is missing;
where county is null;

9. SUBSTR関数を使用している
例)
where substr(state,1,5) = 'North';

10. IN演算子を使用している
例)
where product in ('BED','CHAIR');

11. OR演算子を同じ変数を複数回指定して使用している
例)
where product = 'BED' or product = 'CHAIR' or product = 'DESK';

12. eqt(Equal to Truncated string)演算子を使用している
例)
where state eqt 'New';

13. WHERE条件にて上記演算子をAND演算子を使用して複合的に使用している
例)
where (product in('BED','CHAIR')) and (county is missing);

複合インデックスはWHERE条件にて複数の変数を指定する場合に有効です。 例えば、下の例のようにWHERE条件で変数A、B、Cに常にアクセスするSQL文が発行される場合は、変数A、B、Cすべてを指定した複合インデックスを指定することで該当するSQLクエリのパフォーマンスが改善されます。

例) select * from test where A="a" and B="b" and C="c";

但し、複合インデックスには制約条件がございます。ご使用される場合は発行するSQLがこれらの条件を満たすかどうかご注意ください。

1. SQL文のWHERE条件では少なくともインデックスにて定義している先頭の二つのキー変数を使用している。
2. 複数の条件を指定する場合はAND条件を使用している。
3. 少なくとも条件文の1つにはEQ、またはIN記述子を使用している。

■質問2
 Proc SQLのCreate Indexで作成する場合は“複合インデックスになる”?

■回答2
上記の回答1の通り、単一の変数、複数の変数をインデックスに指定するかによって単一インデックス、複数インデックスが作成されます。create index ステートメントにて単一インデックス、複数インデックスを作成する例を以下に記載致しましたので、ご確認頂けますでしょうか。

単一インデックスの例:

/* データセット */
data test;
set sashelp.class;
run;

/* 複合インデックス */
proc sql;
create index sex on work.test;
quit;


複合インデックスの例:

/* データセット */
data test;
set sashelp.class;
run;

/* 複合インデックス */
proc sql;
create index cmpidx on work.test(sex,age) ;
quit;

■質問3
2.データステップでインデックスが消えるかどうか
たとえば、データセット[test]にインデックスを付与した後、以下のようなデータステップを実行した場合、インデックスは消える?
data test;
merge test(IN=A) test2(IN=B);
by ID;
if A ;
run;

 また、次のデータステップではインデックスは消えない?
proc append base=test data=test2 force ;
run;

■回答3
DATAステップのSETステートメントやMERGEステートメントにてデータセットを作成する場合、データセットを新規に作成します。そのため、頂きましたサンプルの場合、「work.test」という名前の新しいデータセットが新規に作成されるため、インデックスは作成されません。
APPENDプロシジャはBASEオプションに指定したデータセットにDATAオプションに指定したデータセットの内容を追加します。そのため、作成されたインデックスは削除されません。

■質問4
3.インデックスの削除方法
 インデックスの消去方法は?

■回答4
インデックスを削除するにはDROP INDEX文にて以下のように記述します。

drop index <インデックス名> from ※(変数名1,変数名2,...,変数名n);
※複合インデックスの場合は()に変数名を指定します。

/* 単一インデックス */
proc sql;
create index sex on work.test;
drop index sex from work.test;
quit;

/* 複合インデックス */
proc sql;
create index cmpidx on work.test(age,sex);
drop index cmpidx from work.test;
quit;

スポンサーサイト

Formにキーイベントを集約する方法

“Ctrl+Qを押せばフォームを一旦隠す”といったような処理は、フォーカスがどのコントロールにあっても共通して動いてほしい。そんなときは、どこのコントロールでキーが押されても一旦Formにキーイベントを集約し、そこで処理を書くのが便利。
これはフォームのKeyPreviewをTrueにすることでOK。
me.KeyPreview = True
ただ、Excel-VBAには残念ながらこれがない、、、痛い!

パスワードを隠す・直接書かない方法

SASのプログラムファイルに直接ぱすわーどを書きたくない場合、PWENCODEプロシージャを使ってパスワードをエンコードする。

以下、その使い方。

%macro GetPW(orig_pw, macroval_name);
%Global ¯oval_name. ;
filename fn "Z:\saspw.txt";
PROC PWENCODE IN="&orig_pw." out=fn;
RUN;
data _NULL_;
length pw $100.;
infile fn ;
input pw $ ;
call symput("¯oval_name.", compress(pw));
run ;
%put ** ¯oval_name. = &¯oval_name.. **;
%mend ;

%GetPW(mypassword, bbb);
%put SASPW(encoded) = &bbb.;

PROC SQL;
Connect to odbc(dsn='***' uid='MyID' pwd="&bbb.");
Create table *** as
Select * from connection to odbc(select * from ***);
Disconnect from odbc;
Quit;

リンクサーバー作成をSQLで

SQLServer2005のリンクサーバーを管理するGUIがとっても不安定なため、外部のサーバーを使うごとに接続⇔切断を行うためのプログラム

-- Adding linked server:
exec sp_addlinkedserver @server = N'リンクサーバー名',@srvproduct = N'Sybase',@provider = N'MSDASQL',@datasrc = N'ODBC接続名'
exec sp_addlinkedsrvlogin @useself=N'False ',@rmtsrvname = N'リンクサーバー名',@rmtuser = N'ID',@rmtpassword = N'PW'
PRINT CONVERT(varchar, GETDATE(), 120);
go

insert into データベース.dbo.*****
select *
from OPENQUERY(リンクサーバー名, 'SQL文')
;
---------------------------------------------*/

exec sp_dropserver 'リンクサーバー名', 'droplogins';
PRINT CONVERT(varchar, GETDATE(), 120);
go

SH-04A専用の動画変換ツール

docomoの携帯:SH-04A専用の動画変換ソフトです。
超ニッチなソフトですみません、、、
自分専用に作っているので、つくりは超シンプルです。
使い方も特に説明は不要だと思います。

ちなみに、エンジンはffmpeg.exeを使っています。
↓本体↓
[Henkan_forSH04A_Ver2]

【Ver1からの変更点】
・変換が済んだファイルをリストから消す
・“元ファイル移動せず”で起こるバグを解消
※ 佐藤さん、ご意見ありがとうございました!


ソースファイルも載せていますので、VBをご存知の方はご自由に編集してください。
[ソースファイル]




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。