SQL optimizerで実行アルゴリズムを強制する

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 件のコメント:

コメントを投稿