オラ98(オラキュッパ):HOME > 「Windows」に最も相性のいいデータベースを徹底検証
Kさんは一年近くかかったプロジェクトが終わり、ほっと一息。
次のプロジェクトにアサインされるのは一週間後の予定だ。
時間的に余裕があり、新しいプロジェクトに向け最新の技術情報を収集していた。
次のプロジェクトではプロジェクトリーダーという大役を任される予定なので、準備には余念がない。
しかし、ほっとしていられるのもほんの束の間だった。上司のM部長から社内のX事業部とY事業部の売上分析レポートを作成してほしいという依頼を受ける。
Kさん:「今週は時間があるので、今週中にやっておきますよ。」
M部長:「いや、明日の会議で使うから今日中にやってくれる。」
「きたよ、またM部長のむちゃぶり・・・」
Kさんは内心こうつぶやいた
M部長:「新人のJ君が今時間があるから、J君と手分けして何とか頼むよ。」
Kさん:「分かりました。何とか今日中にレポート出してみます。」
Y事業部は最近合併し新規に出来た事業部。
その為、システムもX事業部とY事業部でバラバラであった。
KさんとY君でそれぞれの事業部のレポートを出力しようと決め、X事業部は新人のJ君、Y事業部はKさんが担当することになる。
レポートの内容はシステム内の定型レポートにはなく、データベースから直接データを引っ張ってきて、Excelで分析レポートを作る事になった。今回のようにピンポイントの依頼では、わざわざ分析システムを作るまでもなく、ちゃちゃっとExcelで分析してしまえばいいだろうという考えだ。
「しまった・・」
それぞれの担当を決めた後に、Kさんはこう思った。
X事業部のほうはOracle データベースを利用しているが、なんとKさんが担当するY事業部のシステムには「あのデータベース」を使っていた。
「まずい、ババひいた!」
J君と担当を変えようかと思ったが、先輩として新人に重荷を負わせることはできない。
また嫌な予感が走るが、
「今回はExcelにデータを引っ張ってきてレポートを出すだけなので、問題ないだろう」
という甘い考えを持っていた。この時のKさんには、次から次へと襲い掛かる不幸な出来事のことなど想像できるはずがなかった・・
次プロジェクトに向けた情報収集の際に、Excel 2010ではPowerPivotというデータを分析するためのアドインがあるということを知っていたKさん。
「ちょうどいい機会だから、PowerPivotを使ってちゃちゃっとレポートを出そう。あのデータベースならPowerPivotと相性がいいだろう。」
こう考えたKさんは、
「ひょっとして今回はババではなくラッキーだったかもしれない。」
こう思った。
早速PowerPivotでデータ分析を行うために、あのデータベースに接続しデータを引っ張ってこようとするが、一個目のテーブルから、「データを取得中です(Refresh in Progress)」というメッセージが出力され、一向にデータが取得できない。
待っている間に隣で作業をしているJ君の様子を見ると、なんとJ君もPowerPivotを使っているではないか!
Kさん:「あれっ?PowerPivotってOracle データベースでもオッケーなの?」
J君:「当然っすよ。デフォルトでOracle データベースにも接続できるでしょ。」
しかも、データ取得もサクサクと短時間で終わっているではないか。
J君は既に必要なデータを取得し、Excelで分析レポートを作成し始めている。KさんのPowerPivotの画面は、「データを取得中です(Refresh in Progress)」のまま全く変わっていない。
「データ量は変わらないはずなのに、なんでこんなに差がでるんだ。」
焦り始めたKさんが原因を調べるため、管理ツールであのデータベースの状況を調べていると恐るべき事実が発覚した。
あのデータベースを利用中のアプリケーションが、取得したいテーブルに更新処理を実行しているため、そのテーブルに対してデータを読み取ることができない。
しかも、今日は運が悪いことに月末であった。
月末は顧客毎の営業ステータスを更新する必要があるため、事業部のほぼ全員があのデータベースにアクセスし更新処理をおこなっている。いつまでたってもデータを読み取ることができない。
あのデータベースではダーティーリードという更新確定前のデータを無理やり読取る方法もあるが、PowerPivotではダーティーリードが使えない。
Oracle データベースならば読取り一貫性の機能により、更新中のデータでも読取る事ができるのだが、あのデータベースは更新処理が終わるまで、待たなければならない。
読取り一貫性というのは、データの整合性を保つためということでよく説明されるが、同時実行性を高めるという点でも大きなメリットがあるということをKさんは身をもって経験したのだった。
あのデータベースでもOracleデータベースの読取り一貫性に近い機能が追加されたらしいが、更新対象の行データを全て一時領域に書き込み大量のオーバーヘッドが発生してしまう。検証の段階で遅くて使い物にならない事が判明したため、この機能は使用しない事になっていた。あのデータベースはパフォーマンスを考慮してか、デフォルトでこの機能はOFFになっている。
「業務時間中は無理だ。夜間に作業しよう。」
Kさんはこう思った。
夕方6時になりJ君は帰り支度を始める。
「自分の担当分は終わったんで、部長にメールしときましたよ。
先輩まだなんですか(笑)。では、おさきっ」
「むぐうう・・。新人に先を越された・・。」
面目丸つぶれのKさんは苦い思いであのデータベースにアクセスが無くなるのを待つ。
月末なので夜遅くまで作業している社員が多く、結局、あのデータベースへのアクセスが無くなったのは、夜の11時を過ぎてからだった。
やっとPowerPivotはあのデータベースからデータを取得し始めたが、あるテーブルから情報を取得しようとしたところで、またあの恐怖のメッセージが表示される。
「データを取得中です(Refresh in Progress)」
それから1時間経過したが、全く進んでいる気配がない。
「今度は何が起きたんだ・・・。」
恐る恐るあのデータベースの管理ツールを開き、状況を確認したところ更なる驚愕の事実が判明した。何と夜間バッチが走っているではないか!
「Noーーーーー!」
しかも月末なので、通常より多くのバッチ処理がスケジューリングされていた。結局夜間バッチが終了したのが、朝の6時。
また業務が始まるとデータの取得ができなくなってしまうので、朝の9時までにはデータ取得を完了させなければならない。
しかし、データの取得に時間が掛っている。
「何故だ?」
もうバッチ処理は終わっているのに。
Kさんはここでもう一つ大きな間違いを犯した事に気付いた。
PowerPivotは大量のデータを分析できるとあったので、あのデータベースに格納されているテーブル情報を全て取得しようとしていたのだ。
通常ならば必要な情報のみをフィルタリングして取得する必要があるのだが・・。
J君はPowerPivotで何もフィルタリングせずに、Oracle データベースから必要な情報のみを取得できていた。この違いは何であろうか?
実は、Oracle データベースが稼働するX事業部のシステム の方はセキュリティに配慮して、ユーザごとの必要な情報のみにアクセスするための、「Virtual Private Database(VPD)」という機能を使っていた。
PowerPivotのように、クライアント側にデータを引っ張ってデータを分析するような場合、情報流出を防ぐという意味でもVPDでデータのアクセス制御を掛けるのは重要である。
本来ならセキュリティ面で利用するVPDだが、幸いこの機能のお陰で必要最低限のデータが絞り込まれ、取得するデータ量も少なくなった結果、データの取得が早かったのだ。
刻一刻と時間は過ぎる。続々と同僚も出社してくる。そして、日中の業務が始まる。
結局、またあのデータベースからデータを取得することができなくなってしまった。
徹夜したにも関わらず、データ取得さえできなかった事実に呆然とするKさんのところに朝一、M部長が近づく。
M部長:「おはよう、これから会議で使うから大至急分析レポートメールで送って。」
Kさん:「あの・・、すいません。まだレポート作成終わってないんですけど・・。」
M部長:「はあっ!?J君担当分は昨日既に提出してもらったぞ!」
Kさん:「いや、私の担当分はあのデータベースを利用しており、更新中は・・・」
Kさんの言葉をさえぎり、
M部長:「言い訳するなっ!新人のJ君は出来ただろ!貴様それでもエンジニアかっ!」
Kさん:「すいません。すいません。」
もう謝るしかない。
M部長:「次のプロジェクトリーダーはJ君を抜擢しようかな。君よりも全然仕事が早いし」
「自分が遅いのではなく、あのデータベースが・・・・」
こう思ったが、既に言い訳できる状況ではない。
Kさんの心に、
「PowerPivotでも、やっぱりOracle データベース!」
という言葉が深く刻み込まれたのは言うまでもない。