2017年1月21日土曜日

RDBMSの機能と活用について

自分は、とある場所で勉強会を月1回主催しています。毎回色々なテーマで勉強をするのですが、その中で思ったことがあります。

アーキテクチャの議論の中で、いわゆる3階層構造(データベース、アプリケーションサーバー、クライアント)の構成は、現在はあまりにもアプリケーションサーバーに処理が偏りすぎていて効率的ではないのではという議論がありました。

今自分が直面している課題は、

何十万件のレコードをデータベースからとってきて、金額を計算して、別のテーブルに書き込むという処理で、短時間の間にその処理を完了しなければならないという者です。

要件はたったそれだけなのですが、実現にはいくつかのやり方があります。

パターン1 データを一気にアプリケーションサーバーにもってきて、金額計算をして、テーブルに書き込む。
問題点:アプリケーションサーバーのメモリをものすごく食う。何十万回のINSERTが発生する。→アプリケーションサーバーでエラーが発生するかも。書き込みにものすごく時間がかかる。(もちろん高速化のテクニックはいくつかありますが)

パターン2 データをグルーピングして、塊ごとにLOOPさせて、金額計算をして、テーブルに書き込む。(1の派生系)
問題点:1よりはメモリを食わないが(それでも書き方によるが)、やはり書き込みに時間がかかる。(多重LOOPの中でSQLを発行するのは最悪)

パターン3 SQLで金額計算まで行い、テーブル間でデータをコピーする。
上記問題点は起きないが、ビジネスロジックがSQLに埋め込まれる。
(ストアドプロシージャだとデータベースの中にビジネスロジックが埋め込まれる)

パターン3は、明らかにトレンドに反するが、処理速度は段違いとなる。
机上の計算だと、何十倍も処理速度の差が出て来ることになる。

現在のトレンドだと、RDBMSは、入れ物であってロジックを実装することは、ほとんど無い。(トリガーや参照整合性制約や、チェック制約を実際に使うことは最近ほどんど見かけない)なので、アプリケーションサーバーの役割が増大してしまっている。
(一部バッチ処理にストアドプロシージャを使うことがあるが)

今日やった勉強会では、RDBMSでできることは、RDBMSでやったほうがいいのではという結論になった。(SQLを舐めすぎ!!)

また複雑なSQLに対する恐怖感があるのでは無いかということを感じた。最近のRDBMSは、サブクエリなんかなんとも無い。

それこそ、キーでもってデータを取り出すだけならNO SQLでいいのではと思う。

よって、今年の目標は、RDBMSを極めることとした。

0 件のコメント:

コメントを投稿