相関図おさらい

心臓外科医の術式、いろんな登場人物がいますので、相関図のおさらいからです

Dさんとの会話中

システムの「心臓」こと、Oracle Databaseに日々携わるたろーちゃん。
たろーちゃんとDさんは、Oracle Database について話をしていていました。
その時・・・。

Dさん「それでさ、その時のOracle Databaseの状態を調べたいんだよ。」
たろー「うーん、でもそれはリアルタイムでその時に監視していないと・・・。」
Dさん「やっぱりそれしかないのかな?」
たろー「いや、それか、こうしたら・・・。」

H課長

 

H課長「たろーさん、ちょっといいかな?」


たろーちゃんとDさんが話をしている最中、突然H課長が割り込んできました。
一体なんなのでしょうか?

Dさん「!」
たろー「H課長。お疲れ様です。」
H課長「なんかうちのTさんに、ORACLE MASTER Gold を取得させようとしてるみたいですが、本当ですか?」
たろー「取得させようしているというか、この前RMANで困っていたし、ORACLE MASTER Goldレベルの知識が必要だったので、これを機に取ってみたら?と言ったんですが・・・。」
※Tさんのシステムについては、以前の記事『不完全リカバリを甘く見るな その1』を参照してください。

H課長「うちの課は、そんな技術はいらないんですよ。」
たろー「え?でも、事実リカバリが出来なくて困ってましたよ?」
H課長「困ったら困ったときに調べればいいんですよ。サポートに聞いたっていいし、協力会社に聞いたっていい。
資格だけに走られても困るんで。新人にはもっと他にやらせるべきことがあるんです。」
たろー「・・・。」
H課長「そもそも学習にどのくらいの時間を考えてますか?」
たろー「いや、それはTさんの力量によるんじゃ・・・。業務を優先して、その空き時間を使って勉強すればよいかと・・・。」
H課長「業務を優先?それは当然なんですよ。もしかして、学習にどのくらいの時間を割くのか、まったく考えてないのに、ORACLE MASTER Gold を取得させようとしたんですか?」
たろー「・・・。」
H課長「そもそも、うちの会社で技術系で生きていくのか?マネージメント系で生きていくのか?
サラリーマンの寿命』を考えたとき、Tさんにとって、どっちがいいと思いますか?」
たろー「『サラリーマンの寿命』??」
H課長「そうです。」

・・・・・・・・・・・・・・・・・・・

 

 

 

 


たろーちゃんは答えることが出来ませんでした。
すると、、、

Dさん

DさんH課長、ちょっといいですか?」
H課長「!」


ずっと黙って話を聞いていたDさんが、口を開きました。

Dさん「『会社としての方針』を教えて頂けませんか。たろーちゃんはそれに従いますんで。」
H課長「『会社としての方針』?」
Dさん「そうです。」
H課長「いや、それは・・・『会社としての方針』は分からないけど、Tさんのことを考えたら、どちらが『サラリーマンの寿命』が長いと思いますか?」
Dさん「H課長一個人の考えはどうでもいいんですよ。組織として、キャリアパスや育成は大切なテーマです。」
H課長「・・・。」
Dさん「『サラリーマンの寿命』というならば、そこまでTさんのことを考えてらっしゃるんですよね?逆にお聞きしますが、その『プラン』を教えて下さい。」

H課長

H課長「・・・チッ。」


H課長は無言のまま、自分の席に帰って行きました。

たろー「Dさん・・・。」
Dさん「いやぁゴメン、たろーちゃん。最初は口を出す気はなかったんだけど、話を聞いてたら、段々と腹が立ってきてさ。」
たろー「いえ、ありがとうございました。」
Dさん「組織として、キャリアパスや育成は大切なテーマだ。
それを一個人がどうとか決めるべきではないよ。アンタ、どんだけ偉いの?

 

(苦笑)

Dさん

Dさん「あの人は「こんなこと言える俺スゲー」って、自分に酔ってるだけでしょ?しょうもないね。」


Dさんのおかげで、たろーちゃんは助かりました。
変化球に対応出来ないたろーちゃんにとって、H課長は本当に天敵です。

しかし変化球をことごとく打ち返すDさんって、すごいな。
一体、何者なんだろう・・・?

 

 

 

 

新人Tさんの相談

今度はたろーちゃんのもとに、新人のTさんが訪れました。
何かあったのでしょうか?

新人T「たろーさん。お疲れ様です。」
たろー「Tさん、お疲れ様。・・・あれ、ひょっとしてH課長に何か言われた?」
新人T「え?何のことですか?」
たろー「いや、何もなければいいんだ。こっちの話だから。今日はどうしたの?」
新人T「アプリケーションチームからSQLチューニングを依頼されているんですが、SQLに バインド変数 が使われていて、実行時にどんな値が指定されたか分からないんです。」
たろー「それは、アプリケーションチームが一番よく知ってるんじゃないかな。自分たちが作ったアプリケーションが発行しているSQLなんだから。」
新人T「それが・・・よく分からないって言うんです。」

 

は?

 

 

 

 

新人T「実行時に何が指定されたか、ログが残ってないそうなんです。」
たろー「まったく、何かあった時にどう調査するつもりなんだ。うちのアプリケーションチームは?」
新人T「実行時の バインド変数 を確認する方法って、あるでしょうか?」
たろー「勿論あるよ。」
新人T「本当ですか!」


たろーちゃんは、自分のパソコンに入っているテスト環境を起動しました。

たろー「まず試しに、テストテーブルを作ってみるね。」

CREATE TABLE bind_test(
 x NUMBER,
 y VARCHAR2(10),
 z NUMBER
)
TABLESPACE USERS
;


新人T
「はい。単純なテーブルですね。」
たろー「そう。これに対して、こんな SELECT 文を発行してみる。」
 

SQL> var x number;
SQL> EXEC :x := 1;

SQL> var y varchar2(10);
SQL> EXEC :y := 'abcdefg';

SQL> var z number;
SQL> EXEC :z := 3;

SQL> select /*+ TEST_SQL */  * from bind_test where x = :x and y =:y and z = :z ;

レコードが選択されませんでした。


新人T
「テーブルには何も入ってないから、当然1件もヒットしませんね。」
たろー「うん。そして、テーブルファンクションdbms_xplan.display_cursor() を使うんだ。Tさんはdbms_xplan.display_cursor()って知ってる?」
新人T「はい、知っています。 実行計画 を確認できるファンクションですよね?」
たろー「そのとおり。まずはさっき実行したSQLの SQL_ID を確認するよ。」
 

SQL> select sql_id, sql_text from v$sql where sql_text like '%TEST_SQL%';

SQL_ID        SQL_TEXT
------------- ----------------------------------------------------------------------------
87wyjc5rbxa3t select /*+ TEST_SQL */  * from bind_test where x = :x and y =:y and z = :z
7wdjv5f6s1vkm select sql_id, sql_text from v$sql where sql_text like '%TEST_SQL%'


たろー「これで SQL_ID が 87wyjc5rbxa3t であることが分かった。」
新人T「それを dbms_xplan.display_cursor() の引数にするんですよね?」
たろー「そうだ。但し、第三引数にこれを指定する。」
 

SQL> select * from table(dbms_xplan.display_cursor('87wyjc5rbxa3t','','PEEKED_BINDS'));


PLAN_TABLE_OUTPUT
---------------------------------------
SQL_ID  87wyjc5rbxa3t, child number 0
-------------------------------------
select /*+ TEST_SQL */  * from bind_test where x = :x and y =:y and z = :z


Plan hash value: 1250996780

-------------------------------------------------------------------------------
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |           |       |       |     2 (100)|          |
|*  1 |  TABLE ACCESS FULL| BIND_TEST |     1 |    33 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------


Peeked Binds (identified by position):
--------------------------------------
   1 - :X (NUMBER): 1
   2 - :Y (VARCHAR2(30), CSID=873): 'abcdefg'
   3 - :Z (NUMBER): 3

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(("X"=:X AND "Y"=:Y AND "Z"=:Z))

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

 

新人T「PEEKED_BINDS??見たことのないセクションが出てきました!」
たろー「このようにdbms_xplan.display_cursor() の第三引数に PEEKED_BINDSを指定すると、ハードパース時の バインド変数 を表示することが出来るんだ。」
新人T「全然知りませんでした。」
たろー「但し、この情報はいつまでも共有プールに残っている訳じゃない。時間とともにエージアウト(システムが適切なタイミングで情報を記憶域から追い出すこと)されてしまうから、時間が経ってしまった場合は注意が必要だよ。」
新人T「分かりました。ありがとうございます。ちょっとdbms_xplan.display_cursor()をマニュアルで調べてみます。」
新人T(…)
新人T「あれ?」
たろー「どうした?」
新人T「今マニュアルを見てるんですけど、PEEKED_BINDS なんて引数が載ってないんですけど…。」
たろー「ああ。実はこの引数は、どういう訳か隠し引数になっていてね。マニュアルに載っていないんだよ。」
新人T「ええ?!凄い情報を手に入れました!」

フッフッフ・・・

After that…

部長「何?!今度はそんなことがあったのか。」
Dさん「はい。たろーちゃんが可哀想で、つい口を出してしまいました。」
部長「H課長には困ったものだな。今回はDさんが偶然居合わせたからよかったものの、何か手を打たないと・・・」

部長

今回の「心臓外科医の術式」いかがだったでしょうか?
Oracle Database にはマニュアルに掲載されていない隠し引数がいくつか存在します。
今回はその一例を紹介致しました。
次回も頑張りますので、応援よろしくお願い致します。

投稿者プロフィール

たろーちゃん
たろーちゃん
株式会社システムサポート インフラソリューション事業部に在籍するPlatinumホルダー。
Oracle Databaseのパフォーマンスチューニングを得意とする。
データベースは Oracle 以外興味がないという変わり者。
一番嫌いなエラーメッセージは CRS-02625。
連載「心臓外科医の術式」を執筆。