SASにはSQL optimizerという概念というか機能みたいなものがあります。
以下は僕の独自解釈なので、詳しくはリファレンス等でご確認ください。
SASはproc sqlで指定したSQL文を実行してくれるのですが、一口にSQLを実行すると言っても
内部的に処理するアルゴリズムはたくさんあって、その中からSASが、
このデータセットに対してこのSQL文なら、こういう風にやれば最適なパフォーマンスが出るぜ!と判断した
方法が採用されます。
データセットに適切なインデックスが設定されている場合にjoinなどを使うと、インデックスが利用されますが
これはSASのSQL optimizerがインデックスマージが一番効率的だと判断するからです。
ただ、その判断が必ずしも正確無比とは限りません。たまに最適ではない方法を採用してしまうことも、理屈的には
ありえるわけです。
なので、書いたSQL文の実行が、やけに遅いなと感じたら、実行法をSQL optimizerに判定させるのではなく強制的に
指定してやることで、ごくごくごく稀にパフォーマンスがよくなることがあります
(ほとんどの場合、SQLが遅いのはそいつのSQL文の書き方が悪いだからで、SQL optimizerの判断ミスは少なく
ケチをつけるよりSQL文を見直すかデータステップで頑張った方がいいかも)
以下、実例です。
magic=オプションで決まった数字を足すだけです。
ログに採用された方法がでるはずです。
103はでないのですが確かハッシュ法?だった気がします。
data Q1;
X=1;Y=2;output;
X=2;Y=3;output;
X=3;Y=4;output;
run;
data Q2;
X=2;Z=3;output;
X=3;Z=4;output;
run;
proc sql magic=101 noprint;
create table A1 as
select Q1.X,Y,Z
from Q1 left outer join Q2
on Q1.X=Q2.X;
quit;
proc sql magic=102 noprint;
create table A1 as
select Q1.X,Y,Z
from Q1 left outer join Q2
on Q1.X=Q2.X;
quit;
proc sql magic=103 noprint;
create table A1 as
select Q1.X,Y,Z
from Q1 left outer join Q2
on Q1.X=Q2.X;
quit;
以上です。
0 件のコメント:
コメントを投稿