memoRandum

日々の備忘録

【社内勉強会】第4回WUM

昨日、第4回ウォームアップミーティングに参加してきました。

お客さんとの打ち合わせでまた行かれへん…と思ってたら、

当日になって急遽打ち合わせが中止になったので、

第1回に参加させてもらって以来、やっと2回目参加することができました。

 

今回は、SQLチューニングのお話でした。

ちょうど業務で、SQLの性能も意識して実装しないといけないことが

見えてきてたタイミングだったこともあり、すごく勉強になったので備忘録。

 

 ■SQLチューニング


 システム開発でパフォーマンス問題の原因となることは何か?

大きくは、以下の3つだそう。

1. SQL

 インデックスが利用されていなかったり、JOINが多すぎたり、

 そもそも大量のデータを返していたり、、、

 

2. HTML (JavaScriptなどのフロント部分)

 入力項目が多いと重くなることや、JavaScriptを読む間はブラウザの描画が

 止まるために、最初から使わないものを最初にincludeしてしまうことで、

 表示されるまでの体感速度が遅くなったり、、、

 

3. Java (主にbatch)

 (…メモがない(*_*)

 

今回は、この中でも1. SQLを中心にお話してくださいました。

 

□チューニング方法

 SQLにも、同一の処理に対して複数の記述方法があるけど、

「正しい結果を得ること」ばかりを意識してしまい、パフォーマンスに

ついては考慮されていなかったりする。

「動けばいい」ではなくて「使えるもの」を作らないと意味がないのに。

 

そこで、大きく2つのチューニング方法のご紹介!

 

★定型的なSQLチューニング

 これは、開発チームでコーディングルール的なものを決めておくというもの。

SQLの組み立て方と言うよりは、書き方のルール(大文字小文字の

使い分けとか…)が中心だったと思うけど、開発者のスキルに依存しないで、

一定の品質を保つためにはこれも重要。

 

後は、簡単に意識できることだと(とある『書いてはいけないSQL』の

中から紹介)、

 ・SELECT * を使わない

   必要な項目だけ指定して取得する

 ・WHERE句の左辺に関数を使わない

   インデックスが使えなくなるため、パフォーマンスが下がる

 ・日付の比較のように a が b<a<c となることを条件に書く場合は

  BETWEENを使うこと

   これ、b<a and a<c って書いてるわーと、言われて初めて気付いた…

 ・GROUP BY する項目にインデックスを貼るのは基本

   基本なのに、意識したことなかった…

 

★非定型的なSQLチューニング

 自動生成される実行計画でも、適切かを調査することも大事。

特に、朝と夜では取得するデータ量が大きく異る場合などは統計情報を

取るタイミングを意識しないといけない。

というお話やったんやけど、Oracleに特化した話なのか、、、

MySQLPostgreSQLしかまとも触ったことなくて、イメージが湧かず。。

 

SQLソースコードと同じ

 最初からきれいにパフォーマンスの高いSQLを書くのは難しいこともある

けど、ソースコードリファクタリングするのと同じように、

SQLも1回書いて「よし、動く!」で終わりじゃなくて、リファクタリング

して、効率よく、保守性も高いSQLにしていくべきだと実感。

また、SQLの性能低下の原因となるのは、外部設計の時点で既に問題に

なっている場合が多いそう。そういう状況を防ぐためにも、

上流工程から性能問題を「予防する」という意識を持つことも大事。

 

□とはいえ、場合によって使い分けることが一番大事

 「SELECT * は使わない」ということについて気になったので質問しました。

欲しい項目が少し異なる場合、似たようなメソッドを複数作ってしまうと

いう状況が有り得ると思うんですが、それでも「*」は使わないべきなのか、

保守性も考えて似たようなメソッドを乱立させるべきでないのか。

というようなことを、まとまらないまま話しました。。。

もちろん、似たようなメソッドが乱立する状況はよくなくて、

解決策としては、取得したい項目を引数として渡すことで極力「*」は

使わないようにできるとの解答をいただきました。

でも、ORマッピングなんかは「*」で取ってくるけど、それも良くないの?

と思って質問したら、生産性上がるからぜひ使ってくださいとの

解答をいただきました。

これでは、どうしていいのか分からない…(*_*)

 

でも、「*」をつかうことでパフォーマンスが低下するのは一部の話で

あって、データ量や書いてるSQLにもよるのはもちろんなので、

パフォーマンスを意識して使い分けられることが重要という結論に至りました。

感覚的なものもあるので慣れることも重要だとか。

 

 ■LTを聞いて思ったこと


□まだまだ出会ってない素敵な先輩がいっぱいいる

 1人目は、4年目の女性の先輩が話してくれはったんやけど、

すごく高い意識を持って勉強会などなどの活動を積極的にしてはることを知った。

2人目も女性の先輩で、ワーキングマザーのライフワークバランスについてのお話。

残念ながら、まだまだ予定はないけど、子育てと仕事を両立させることについて

どっちも100%はムリやから、周りに甘えることも大事っていうことは

しっかり覚えとこうと思った。

自分が絶対どっちも100%を目指そうとする性格なのはよく分かってるし。。

 

LTしてくれはった先輩方とも、SQLチューニングについて話してくれはった

先輩とも直接話してみたかったけど、懇親会参加せずに帰っちゃったので、

いつか話せる機会があれば嬉しいなと思いながら、、まとめ終わり。