BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
sskt
Obsidian | Level 7

お世話になっております。

連続になり申し訳ありませんが、質問させていただきます。


proc sqlにもデータステップにもあるインデックスですが、その貼り方について何点かよくわからないので質問させていただきます。
(SAS Advanced Programmingの分厚い本を参照してますが見落とし等あったらすいません。)

 

・SQL関係のページをググるとwhereとorder byする列に貼ればいいという話が書いてあったので、大きいデータセットを扱う際はwhereとsortする列に貼ればOKということでしょうか?
・複合インデックスなるものもあるようですがどのようなときに採用すればよいのでしょうか。whereする変数が複数個のとき、ということでしょうか?
・一度インデックスを貼ったデータセットを扱うときはsetステートメントではなくmodifyステートメントでないと無効になってしまう、という理解で正しいのでしょうか?

 

お手数ですがお詳しい方、よろしくお願いいたします。

1 ACCEPTED SOLUTION

Accepted Solutions
yu_sas
SAS Employee

SASインデックスを作成するべきかというのは、データと実行したい処理に依存するので一概に

判断できません。以下のドキュメントに詳細があるので役立つかと思います。

 

SAS 9.4 言語リファレンス:解説編 第4版

p632. SASインデックスについて

 

インデックスが利用されるのはDATAステップであればWHEREやBYステートメントですので、

これらに指定する変数に対し作成を検討すべきであると思います。通常インデックスを作成

した変数でソートする必要はありません。

 

複合インデックスはご認識の通り複数の変数による条件に対し利用されます。しかし少なく

とも一つのEQかIN演算子が必要などの制約があります。なお条件が一つでも、インデックス

作成時に最初に指定した変数であれば使用されます。

 

options msglevel=i;
data test(index=(xy=(x y)));
call streaminit(123);
do i=1 to 100;
 x=rand('poisson',10);
 y=rand('poisson',10);
 output;
end;
run;

data test2;
set test;
where x=10 and y=10;
run;

data test3;
set test;
where x=10;
run;

/* 使われない */
data test4;
set test;
where y=10;
run;

SETやUPDATEステートメントは出力データセットを同名にしても、同名のデータセットを

新規で作成し置き換えているだけですので、インデックスは保持されません。編集する場合

MODIFYを使います。

 

インデックス全般について、少し古いものですが以下のPaperも参考になるかと思います。

 

Frequently Asked Questions about SAS® Indexes

View solution in original post

1 REPLY 1
yu_sas
SAS Employee

SASインデックスを作成するべきかというのは、データと実行したい処理に依存するので一概に

判断できません。以下のドキュメントに詳細があるので役立つかと思います。

 

SAS 9.4 言語リファレンス:解説編 第4版

p632. SASインデックスについて

 

インデックスが利用されるのはDATAステップであればWHEREやBYステートメントですので、

これらに指定する変数に対し作成を検討すべきであると思います。通常インデックスを作成

した変数でソートする必要はありません。

 

複合インデックスはご認識の通り複数の変数による条件に対し利用されます。しかし少なく

とも一つのEQかIN演算子が必要などの制約があります。なお条件が一つでも、インデックス

作成時に最初に指定した変数であれば使用されます。

 

options msglevel=i;
data test(index=(xy=(x y)));
call streaminit(123);
do i=1 to 100;
 x=rand('poisson',10);
 y=rand('poisson',10);
 output;
end;
run;

data test2;
set test;
where x=10 and y=10;
run;

data test3;
set test;
where x=10;
run;

/* 使われない */
data test4;
set test;
where y=10;
run;

SETやUPDATEステートメントは出力データセットを同名にしても、同名のデータセットを

新規で作成し置き換えているだけですので、インデックスは保持されません。編集する場合

MODIFYを使います。

 

インデックス全般について、少し古いものですが以下のPaperも参考になるかと思います。

 

Frequently Asked Questions about SAS® Indexes