はじめに
MKが1000番の、ある部品の製造ステータスがBという工程に入った――。
下図右側に、いわゆる未完成部品リストというものがある。この未完成部品リストは毎日サーバー上で生成され、その「未完成の量」という情報を使ってバーンダウンチャートを作成するのだ。そのバーンダウンチャート作成ツールのお話。
ところでこのプログラム...
全部Excelで処理しようとしていて、毎日5時間かかる処理だ。
1日8時間のなかで毎日5時間っていうのはなかなかタフだろう。実際はタスクスケジューラでキックがかかるので2時間ぐらい稼げるけどそれでも3時間パソコンさわれないのはキツいで...
仕事場のパソコンのスペックは高いとは限らない
Celeronの1.9...だったなぁたしか えっぐい
エクスペリエンスインデックスとかいうあの数字のヤツは評価が算出できないほど低い...わかるね?OSはWindows7だ。
やってることはホンマにただの集計
もう一回同じ図を持ってくるけど、本来はSQLでサーバーからカウント取ってまとめればいいだけの話。最初どうしてこんなに時間がかかるかわからなかった。この遅さは、未完成部品リストのシートAを集計していたいつもの処理に加えて、ちょっと条件の異なるシートBもやってほしいという改修の中で発覚した(処理量が倍以上になるため)。
時間がないしドキュメントもない
SQLから持ってくる形にしたいが、そのSQL(ストアドプロシージャ)がこれまた鬼畜なことになっている。現場入って数か月では業務データのロジックなんてわかるわけがない。ドキュメントもなくソース嫁状態で、与えられた期間は5日。おおもとのSQLを解析している時間の余裕はない...。「結果セット」として生成された日次Excelを読んでひとつひとつ加算処理をするというつくりが心臓部になっている以上は、この流れを利用するしかない。
処理の重さの分析
いま家にいるし細かいところは忘れちゃったんだけど(まぁ細かく話しても今度はコンプラだしな...)、だいたいの流れとして未完成部品リストをループの軸にして、全量まわって Find で集計シートから key を検索して 1を足す みたいなことをしているからクソ重いわけだ。おまけにこのループのなかでクソ重いテーブルにSELECTを投げる処理があった。ただでさえ量が多い未完成部品リスト側でループをかけているし、つまり未完成部品リストが15,000明細あったらSQLServerに15,000回SELECTを投げてるわけだ。これはネゴっていったんやめにしてもらったが、それにしてもひどい。
改修方針
この場合、つくりとしては、左側の集計シート側をループの軸にしなければならない。集計keyが1に対して明細はnなんだから。間違いない...「作っちゃいけない人間」が作っている(しかも例によって作成者本人はもういないし会ったこともない)
(togetter)流しのプログラマーはメキシコの荒野みたいな現場に行かされがちで着いてみると大体こうなる
ソースコード
GitHub にあります(クロス集計版を追加)
クロス集計版は ExcelManipulator を使用します
これ便利だった
さいごに
Qiitaに書いたらドキュメント書いてるようなもんやなww
休みに仕事した分は、せめて汎用化してオープンにさせてもらうわ
週明け楽しみになってきたぞ
縮小された時間を計ってみた
4:53:35 かかっていたのが 0:41:33。
3:21:10 縮めたことになる