SQLをゴリゴリ


とあるデータを集計してグラフを描くという仕組みづくりをしている。集計にはSQLServer Expressを使っている。グラフを描くのはExcelだ。グラフが描画できる形のデータにするためにSQLバッチを書いていたら結構長くなった。最終的な表からCSVを吐き出してExcelで読み込んでグラフを描く。わざわざCSVを吐き出しているのはSQLServerの走るマシンを外からアクセスすることができないからだ。逆のアクセスはできるのでCSVをExcelが走るマシンにコピーするというわけ。

データのイメージを固めてそのためにゴリゴリとSQLで加工していくのは結構楽しい。ホントはもっとまじめに考えると一行のSQLで済むかもしれないところを一時表を使って楽をしたりする。バッチ処理はせいぜい1分ほどで、一日一回走れば充分だから、性能のためのチューニングなど考えずに処理を書いている。ひょっとするとインデクスをつけると早くなる処理があるかもしれないが、そこまで考える必要は全くないのだ。

今回は純粋にSQLのバッチなので関係ないが、SQLデータベースをアクセスするプログラムを書く時、なんでもカーソルを使って1レコードずつ処理しようとする人がいる。こういう人はデータベースの仕組みがわかっていない。SQLで処理できることはとにかく一行のSQLにして実行するのが良いのだ。計算戦略は賢いDBMSなら自分で立ててくれる。データの蓄積具合によって最適な戦略が選ばれるようになっているのだ。それにチューニングもDBMSのパラメータ設定とかインデックス定義とかさまざまな手法で行うことが出来る。プログラムのロジックの中で処理をしてしまうと自分のCPUを使ってしまうが、サーバの方が速いケースだってある。

というわけでDBMSにどんどん仕事をさせるのが良い。できることならインラインでSQLを使うようなプログラムを書かずにSQLバッチを多用するほうが良い。こんなことは常識のようで案外変な設計をしてしまう人がいたりして驚くことがある。プロジェクトでは走りだすと簡単には止められない。変な設計でも走り続けるしかなくなってしまうこともある。そしてデスマーチがはじまるのである。

今やっていることにはそんな心配はないのだけど、SQLをゴリゴリと書きながらそんなことを考えたりしているのである。

カテゴリー: 技術, 日々 タグ: パーマリンク