Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

BtoCでバインド変数

  • Be the first to comment

  • Be the first to like this

BtoCでバインド変数

  1. 1. BtoCでバインド変数を使用しなかったら・・・ GMOメディア株式会社 植木義人
  2. 2. 自己紹介Twitter ID:kingyokkun職業:DBエンジニア所属:GMOメディア株式会社Oracle、MySQL、PostgreSQL、MongoDBなどの設計・構築・運用・SQLなど全般やってます。Oracleの好きな機能はバックアップ周り。SEばかり扱っているからパーティションは嫌い!
  3. 3. ちょっとだけ会社紹介下のような無料のWebサービスを作っているBtoCの会社です。
  4. 4. 本題
  5. 5. まず、バインド変数とはWHERE USER_ID=:a、これがバインド変数。WHERE USER_ID=1000000、これがリテラル。Oracleは実行計画を共有プールに保存する事でParseのスピードを上げます。バインド変数を使えば複数のSQLで実行計画を共有できます。しかし、リテラルの形でSQLを作るとIDの数分の実行計画が保存されます。要は上記SQLでユーザーが100万人いた場合、リテラルだと100万個の実行計画が共有プール上に作られるわけです。
  6. 6. 今回のDB状況前述したように無料のWebサービスのプラットフォームに使われているデータベースです。 Oracle 11gR2 Standard 会員数 400万人程度 400万人程度 クエリ数 クエリ数 千万~1.3億 平常時) 7千万~1.3億(平常時) memory_target 36Gbyte
  7. 7. 皆さん、バインド変数を使用する事 意識してますかー!
  8. 8. うちは 意識してなかったー!そもそも、前任者が知らなかったようで。残念な状態になってました。
  9. 9. で、残念な状態 Gbyteバッファキャッシュ 8Gbyte共有プール共有プール 13Gbyte 13GbytePGA 12Gbyte 12Gbyte バッファキャッシュ よりも大きい共有 よりも大きい共有 プールって って・・・ プールって・・・
  10. 10. ま、でも。障害になってないし、いっか。 ん~、共有プール足らない場合は ~、共有プール足らない場合は 共有プール 場合 ORA-4031出るけど、 てないし。 ORA-4031出るけど、出てないし。 昔と違ってメモリサイズがでかく ってメモリサイズ メモリサイズがでかく なってるから、 実行計画は なってるから、古い実行計画は無理 なくフラッシュされてるんでしょ。 フラッシュされてるんでしょ なくフラッシュされてるんでしょ。 すでに運用入っているサービス 運用入っているサービスの すでに運用入っているサービスの修 ってきついんだよね~・・・。 正ってきついんだよね~・・・。
  11. 11. そんなある日 障害! 障害
  12. 12. 対応遅延遅延遅延状態・・・。セッション切っても次々にたまっていくばかりだし、行ロックもしてないのに・・・。うー・・・・。 再起動! 再起動
  13. 13. 今日の格言論よりリブート! Oracleエンジニアにとって大 エンジニアにとって大 エンジニアにとって ですねー 事ですねー。MySQL(特に 特 だと、 MyISAM)だと、とりあえず だと 再起動なんてやると なんてやると、 再起動なんてやると、とどめ さす事になります。 さす事になります。
  14. 14. 後で調査しました。library cache lock、cursor mutex:S。共有プールでmutexが大量発生していました。実は以前から怪しいと思っていた数値があったので、このエラーを契機に改めて確認しました・・・。すると。
  15. 15. 1時間に40000回のメモリフラッシュ・・・(by Performance Insight) 共有プール空 領域の 共有プール空き領域のサー プール フラッシュで遅延を チとフラッシュで遅延を起 こしていたのね・・・ ・・・。 こしていたのね・・・。
  16. 16. 対応策リテラルを使っているSQLを減らしました。v$sqlareaに残っているSQL60~70万クエリくらいを全部引っ張りだし、エディタ上で検索かけながら、修正すべき30くらいのSQLを抽出しました。後は開発のお尻を叩くだけ。
  17. 17. 困ったところIN句です。BtoCサイトだとSNS的な事をやったりして、友達ユーザーの情報表示をするなどINを失くすのは難しい・・・。INは引数の数が決まってないから、バインド変数化しにくいのです。結局、引数が1個の時だけバインド変数処理を用意しておいて、アプリ側で引数が2個以上の処理をリテラルにハンドリングしてもらいました。
  18. 18. 対応の結果共有プール共有プール 13G 13G→6Gバッファキャッシュ 8G→14GPGA 12G 12G→13Gv$sqlareaのカウント 70万→8千5百 $sqlareaの 多分、 多分、2Gくらいまではで くらいまではで きたけど、 きたけど、 このくらいにしておきまし た。
  19. 19. メモリフラッシュ数の比較
  20. 20. 結論バインド変数をなめてはいかん、と。また、Oracle上級者でもバインド変数非対応イコールORA-4031と認識している方が多いです。昨今ではメモリが大きくなっている関係なのか、なかなかORA-4031は出ません。しかし、メモリのフラグメント等も手伝って、mutexが大量発生して遅延になるようです。特にBtoCのようなアクセス量の多いサイトではこうなります。気をつけましょう。
  21. 21. 最後にOSSのRDBと比べて、Oracleが本当に優れていると思う部分はメモリの扱い。メモリ関連のパラメータは本当に大事ですので、理解して使いましょうね。
  22. 22. 以上です。ご清聴ありがとうございました。

×