開発思考実験日記

2018-06-02

[]くそストアドプロシージャ

ビジネスロジックを全てSQL Serverのストアドプロシージャで書いていてパフォーマンスがでなくて困っている話を聞いた。

どうも数千行のストアドで内容的にも分からないので、なかなか前に進まないらしい。

性能向上の第一歩は計測なのですが、その影響で性能が落ちるのが怖くて、本番計測も簡単ではないようです。

個人的にはストアドでビジネスロジックを書くこと自体受け入れ難い話なのですが、このような状況で対処するならどんな方法にするかなと

ここでの課題を並べると

・性能の計測が本番に適用できない

・パフォーマンスが出ない処理の特定方法が分からない

・でかいストアドに対する対処


性能の計測が本番に適用できない

これは性能測定をした場合の影響が小さければいいわけですが、どのくらいの影響がでるかが分からないレベルなんでしょうね

SQLプロファイラ(GUI)とかだと遅そうですが、その他にも選択肢はあります。以下の記事で様々な方法の比較があって、拡張イベントであれば10%程度遅くなりますが許容範囲のように見えます。

Measuring “Observer Overhead” of SQL Trace vs. Extended Events

トレースファイル:約20% 影響(遅くなる)

SQLプロファイル:約80%影響(遅くなる)

拡張イベント  :約10% 影響(遅くなる)


パフォーマンスが出ない処理の特定方法が分からない

計測ができていてもその解析方法が分からないと前に進みません。特定のSQLであれば実行プランなどを見て改善できますが、問題になるSQL文やプロシージャを特定する必要があります。これらの絞り込みはSQL実行時間やCPUコスト、IOコスト、実行回数を調査することになります。

第4回 サーバートレースの解析方法


でかいストアドに対する対処

問題がわかってもストアドが複雑で単純には手を付けれない場合は、その複雑度を下げることを考えます。

リファクタリングが思いつきますが、ストアドのリファクタリングツールを探してみるといくつかあるようです。

SQL Enlightをみるとストアードプロシージャや関数としてT-SQLスクリプトカプセル化するようなこともできるので、大きなストアドを機械的に分割しながら構造化して扱い易くします。



最後に

くそストアドプロシージャとの戦いはこれらの作業を繰り返して改善していくんでしょうね。

あと、データ分割して並列実行のアプローチ(ミニバッチ化)や、それをさらに小さくしてストリーム処理にしてしまうアイデアもありですね。

一番いいのは、くそストアドプロシージャに出逢わないことなんでしょうが

2018-05-24 (ー_ー)

[]興味深いプラクティス

持続可能なソフトウェアとアジャイル

ガイドラインに書かれるのは、15行以上のメソッドを書かない、6行以上のコードを重複しない、自動テストのカバレッジとして90パーセントを維持するといった、ごく単純なことです。

2018-05-13 (^_^)

[]将棋AIで学ぶディープラーニング

AlphaGoディープラーニングの仕組みを詳しく説明してくれていてありがたい。

将棋AIで学ぶディープラーニング

将棋AIで学ぶディープラーニング

将棋とかだと評価関数パラメータ学習させるNNなんかを想像するけどCNNでやるんだね。

盤面や持ち駒の表現の仕方はこんな風にするんだと驚きました。勉強になります。

スパースなデータ表現をしてそれをCNNで特徴検出するのは案外よくやる手何ですかね。

強化学習のさせかたなんかも参考になる。

2018-05-03 (^_^)

[]Devopsのトレンド

infoQの記事ですが、普及期になってきた技術としてコンテナや、Blue-Green配置などがあがってきています。

イノベーションにはカオスエンジニアリングとか興味深いですね。初めてみる単語もちらほら、技術速度は早いですね

Devopsトレンドレポート

https://res.infoq.com/articles/devops-cloud-trends/en/resources/2devops-q1-2018-1517237922473.jpg

2018-04-28 (^_^)

[]DeepCode

以前からアイデア的には僕にもあったのですが、やはり出て来ました。Deep Learningプログラムを診断・修正する仕組み。

さらに複雑度の高いメソッドを自動的にリファクタリングするとか、自動テストが自動的に生成されるとかいいだけどな。

IDEリファクタリングツール教師データを集めて学習させる仕組みを考えればできそうなんですが。。。