proc SQLの _methodや_treeオプションで内部でどのような処理が行われているかを把握する。読み解くのにかなり知識がいるけどデバックに使えます

以前、「SQL optimizerで実行アルゴリズムを強制する」
http://sas-tumesas.blogspot.jp/2014/04/sql-optimizer.html

でSQL実行の際の内部処理の話をしましたが、今回もそれに関連する話です。
ただ、先に言い訳ですが、僕はまだSQLの内部処理のような深い部分は勉強中で大して理解できていないので、機能の紹介だけです。

data Q1;
X='い';A=1;output;
X='ろ';A=2;output;
X='は';A=3;output;
run;

data Q2;
Y='い';B=1;output;
Y='ろ';B=2;output;
Y='は';B=3;output;
run;

という2つのデータセットがあって、Xの値とYの値で内部結合する処理を考えた場合、

proc sql _method;
 select X
       ,A
       ,B
       ,A+B as AB
 from Q1 inner join Q2
 on X=Y
;
quit;

と _methodオプションを追加すると、ログに









とでてきます。

sqxslctはseletの実行、sqxsrcは行が読み込まれたことを示してます。
sqljhshはハッシュ法による内部処理が実行されたことを示しています。
magicオプションの値を変えると、ここの記述が変わることが確認できます。

詳しくは、この読み方に言及した論文がいくつか挙がっているのでそちらを参照ください。
(例えばhttp://support.sas.com/resources/papers/proceedings13/200-2013.pdf


次に

proc sql _tree;
 select X
       ,A
       ,B
       ,A+B as AB
 from Q1 inner join Q2
 on X=Y
;
quit;

と_treeオプションを追加すると、ログに



こういうツリープロットが出現します。

うぉ~、なんじゃこりゃって感じですが、これが、SQLで実際どのように構文を解釈して、実行するかの処理を示しています。

以下はちょっと怪しい解釈

2階層目にJOINってでてますよね、結合処理であることを示してます。
3階層目の/-OBJのところが、最終的な出力部分の定義です。
んで/-FROMはその処理のために読み込まれるテーブルです。
/-CEQのところはXの値とYの値の同値判定していることを示しています。
/-ERLYのところは今回、AとBの値を足してABという新規変数を作っているのですが、そこの部分です。

詳しくは、これまたたくさん論文がでてるので、それで理解するようにしていただけたらと思います。

(例えばhttp://www2.sas.com/proceedings/sugi30/101-30.pdf


SQLって、結構コードから結果を頭の中で想像するのが難しいですよね。
複雑で長いものになると、なにやってんだこれ?ってなります。
そういった際にこういったオプションをつけると、読み解く助けになるかもしれません。

0 件のコメント:

コメントを投稿