SlideShare una empresa de Scribd logo
1 de 22
Descargar para leer sin conexión
BtoCでバインド変数を
使用しなかったら・・・
  GMOメディア株式会社
      植木義人
自己紹介

Twitter ID:kingyokkun
職業:DBエンジニア
所属:GMOメディア株式会社

Oracle、MySQL、PostgreSQL、MongoDBなど
の設計・構築・運用・SQLなど全般やってます。
Oracleの好きな機能はバックアップ周り。SEばか
り扱っているからパーティションは嫌い!
ちょっとだけ会社紹介

下のような無料のWebサービスを作っている
BtoCの会社です。
本題
まず、バインド変数とは

WHERE USER_ID=:a、これがバインド変数。
WHERE USER_ID=1000000、これがリテラル。
Oracleは実行計画を共有プールに保存する事で
Parseのスピードを上げます。
バインド変数を使えば複数のSQLで実行計画を共
有できます。しかし、リテラルの形でSQLを作る
とIDの数分の実行計画が保存されます。
要は上記SQLでユーザーが100万人いた場合、リ
テラルだと100万個の実行計画が共有プール上に
作られるわけです。
今回のDB状況

前述したように無料のWebサービスのプラット
フォームに使われているデータベースです。

  Oracle          11gR2 Standard
  会員数             400万人程度
                  400万人程度
  クエリ数
  クエリ数             千万~1.3億 平常時)
                  7千万~1.3億(平常時)
  memory_target   36Gbyte
皆さん、
バインド変数を使用する事
 意識してますかー!
うちは
 意識してなかったー!
そもそも、前任者が知らなかったようで。残念
な状態になってました。
で、残念な状態
           Gbyte
バッファキャッシュ 8Gbyte
共有プール
共有プール     13Gbyte
          13Gbyte
PGA       12Gbyte
          12Gbyte


            バッファキャッシュ
             よりも大きい共有
             よりも大きい共有
            プールって
                って・・・
            プールって・・・
ま、でも。
障害になってないし、いっか。



     ん~、共有プール足らない場合は
      ~、共有プール足らない場合は
         共有プール      場合
     ORA-4031出るけど、 てないし。
     ORA-4031出るけど、出てないし。
     昔と違ってメモリサイズがでかく
          ってメモリサイズ
             メモリサイズがでかく
     なってるから、     実行計画は
     なってるから、古い実行計画は無理
     なくフラッシュされてるんでしょ。
        フラッシュされてるんでしょ
     なくフラッシュされてるんでしょ。
     すでに運用入っているサービス
         運用入っているサービスの
     すでに運用入っているサービスの修
      ってきついんだよね~・・・。
     正ってきついんだよね~・・・。
そんなある日



 障害!
 障害
対応
遅延遅延遅延状態・・・。
セッション切っても次々にたまっていくばかりだ
し、行ロックもしてないのに・・・。
うー・・・・。


        再起動!
        再起動
今日の格言

論よりリブート!

  Oracleエンジニアにとって大
        エンジニアにとって大
        エンジニアにとって
   ですねー
  事ですねー。MySQL(特に
               特
          だと、
  MyISAM)だと、とりあえず
          だと
  再起動なんてやると
       なんてやると、
  再起動なんてやると、とどめ
  さす事になります。
  さす事になります。
後で調査しました。
library cache lock、cursor mutex:S。
共有プールでmutexが大量発生していました。実
は以前から怪しいと思っていた数値があったので、
このエラーを契機に改めて確認しました・・・。
すると。
1時間に40000回のメモリフラッシュ・・・
(by Performance Insight)




           共有プール空 領域の
           共有プール空き領域のサー
             プール
             フラッシュで遅延を
           チとフラッシュで遅延を起
           こしていたのね・・・
                  ・・・。
           こしていたのね・・・。
対応策
リテラルを使っているSQLを減らしました。
v$sqlareaに残っているSQL60~70万クエリ
くらいを全部引っ張りだし、エディタ上で検索
かけながら、修正すべき30くらいのSQLを抽出
しました。
後は開発のお尻を叩くだけ。
困ったところ
IN句です。BtoCサイトだとSNS的な事をやっ
たりして、友達ユーザーの情報表示をするなど
INを失くすのは難しい・・・。INは引数の数が
決まってないから、バインド変数化しにくいの
です。
結局、引数が1個の時だけバインド変数処理を
用意しておいて、アプリ側で引数が2個以上の
処理をリテラルにハンドリングしてもらいまし
た。
対応の結果
共有プール
共有プール         13G
              13G→6G
バッファキャッシュ 8G→14G
PGA            12G
               12G→13G
v$sqlareaのカウント 70万→8千5百
 $sqlareaの

                 多分、
                 多分、2Gくらいまではで
                      くらいまではで
                 きたけど、
                 きたけど、
                 このくらいにしておきまし
                 た。
メモリフラッシュ数の比較
結論
バインド変数をなめてはいかん、と。
また、Oracle上級者でもバインド変数非対応イ
コールORA-4031と認識している方が多いです。
昨今ではメモリが大きくなっている関係なのか、
なかなかORA-4031は出ません。しかし、メモ
リのフラグメント等も手伝って、mutexが大量
発生して遅延になるようです。
特にBtoCのようなアクセス量の多いサイトで
はこうなります。気をつけましょう。
最後に
OSSのRDBと比べて、Oracleが本当に優れてい
ると思う部分はメモリの扱い。メモリ関連のパ
ラメータは本当に大事ですので、理解して使い
ましょうね。
以上です。
ご清聴ありがとうございました。

Más contenido relacionado

La actualidad más candente

binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group CommitTakanori Sejima
 
yet another all-in-one cloudfoundry
yet another all-in-one cloudfoundryyet another all-in-one cloudfoundry
yet another all-in-one cloudfoundryKen Ojiri
 
MySQL 初めてのチューニング
MySQL 初めてのチューニングMySQL 初めてのチューニング
MySQL 初めてのチューニングCraft works
 
sysloadや監視などの話(仮)
sysloadや監視などの話(仮)sysloadや監視などの話(仮)
sysloadや監視などの話(仮)Takanori Sejima
 
CasualなMongoDBのサービス運用Tips
CasualなMongoDBのサービス運用TipsCasualなMongoDBのサービス運用Tips
CasualなMongoDBのサービス運用TipsNaoki Sega
 
Garage labsサーバー部11U final
Garage labsサーバー部11U finalGarage labsサーバー部11U final
Garage labsサーバー部11U finalTakehito Tanabe
 
MySQLの運用でありがちなこと
MySQLの運用でありがちなことMySQLの運用でありがちなこと
MySQLの運用でありがちなことHiroaki Sano
 
MongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualMongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualYasuhiro Matsuo
 
MongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステムMongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステムHitoshi Asai
 
Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStackirix_jp
 
Jubatus 新機能ハイライト
Jubatus 新機能ハイライトJubatus 新機能ハイライト
Jubatus 新機能ハイライトJubatusOfficial
 
Seasar conference 2015 sa-compojure
Seasar conference 2015 sa-compojureSeasar conference 2015 sa-compojure
Seasar conference 2015 sa-compojureYoshitaka Kawashima
 
Debian Update: ~ Jessie, Stretch, Buster ~
Debian Update: ~ Jessie, Stretch, Buster ~Debian Update: ~ Jessie, Stretch, Buster ~
Debian Update: ~ Jessie, Stretch, Buster ~Youhei SASAKI
 
モダンブラウザストレージ
モダンブラウザストレージモダンブラウザストレージ
モダンブラウザストレージKazuyuki Mori
 
Rumpを使ってみる
Rumpを使ってみるRumpを使ってみる
Rumpを使ってみるMasaru Oki
 
fukinfra Vol3 LT 20120629
fukinfra Vol3 LT 20120629fukinfra Vol3 LT 20120629
fukinfra Vol3 LT 20120629学 松崎
 

La actualidad más candente (20)

binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group Commit
 
CPUに関する話
CPUに関する話CPUに関する話
CPUに関する話
 
yet another all-in-one cloudfoundry
yet another all-in-one cloudfoundryyet another all-in-one cloudfoundry
yet another all-in-one cloudfoundry
 
MySQL 初めてのチューニング
MySQL 初めてのチューニングMySQL 初めてのチューニング
MySQL 初めてのチューニング
 
sysloadや監視などの話(仮)
sysloadや監視などの話(仮)sysloadや監視などの話(仮)
sysloadや監視などの話(仮)
 
CasualなMongoDBのサービス運用Tips
CasualなMongoDBのサービス運用TipsCasualなMongoDBのサービス運用Tips
CasualなMongoDBのサービス運用Tips
 
Garage labsサーバー部11U final
Garage labsサーバー部11U finalGarage labsサーバー部11U final
Garage labsサーバー部11U final
 
MySQLの運用でありがちなこと
MySQLの運用でありがちなことMySQLの運用でありがちなこと
MySQLの運用でありがちなこと
 
MongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualMongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasual
 
MongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステムMongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステム
 
Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStack
 
Jubatus 新機能ハイライト
Jubatus 新機能ハイライトJubatus 新機能ハイライト
Jubatus 新機能ハイライト
 
Seasar conference 2015 sa-compojure
Seasar conference 2015 sa-compojureSeasar conference 2015 sa-compojure
Seasar conference 2015 sa-compojure
 
Debian Update: ~ Jessie, Stretch, Buster ~
Debian Update: ~ Jessie, Stretch, Buster ~Debian Update: ~ Jessie, Stretch, Buster ~
Debian Update: ~ Jessie, Stretch, Buster ~
 
モダンブラウザストレージ
モダンブラウザストレージモダンブラウザストレージ
モダンブラウザストレージ
 
Rumpを使ってみる
Rumpを使ってみるRumpを使ってみる
Rumpを使ってみる
 
fukinfra Vol3 LT 20120629
fukinfra Vol3 LT 20120629fukinfra Vol3 LT 20120629
fukinfra Vol3 LT 20120629
 
Metaspace
MetaspaceMetaspace
Metaspace
 
membase
membasemembase
membase
 
apasec001-kawai
apasec001-kawaiapasec001-kawai
apasec001-kawai
 

Destacado

超先取りShenandoahGC
超先取りShenandoahGC超先取りShenandoahGC
超先取りShenandoahGCYohei Oda
 
20141108 俺のエンジニアリング #devlove
20141108 俺のエンジニアリング #devlove20141108 俺のエンジニアリング #devlove
20141108 俺のエンジニアリング #devloveTakao Oyobe
 
20140301ハッカーズチャンプルー告知lt
20140301ハッカーズチャンプルー告知lt20140301ハッカーズチャンプルー告知lt
20140301ハッカーズチャンプルー告知ltKoichiro Nishijima
 
How to customize redmine public
How to customize redmine publicHow to customize redmine public
How to customize redmine publicHirotaka Nishimiya
 
困らない程度のJDK入門
困らない程度のJDK入門困らない程度のJDK入門
困らない程度のJDK入門Yohei Oda
 
私がドメイン駆動設計をやる理由
私がドメイン駆動設計をやる理由私がドメイン駆動設計をやる理由
私がドメイン駆動設計をやる理由増田 亨
 

Destacado (6)

超先取りShenandoahGC
超先取りShenandoahGC超先取りShenandoahGC
超先取りShenandoahGC
 
20141108 俺のエンジニアリング #devlove
20141108 俺のエンジニアリング #devlove20141108 俺のエンジニアリング #devlove
20141108 俺のエンジニアリング #devlove
 
20140301ハッカーズチャンプルー告知lt
20140301ハッカーズチャンプルー告知lt20140301ハッカーズチャンプルー告知lt
20140301ハッカーズチャンプルー告知lt
 
How to customize redmine public
How to customize redmine publicHow to customize redmine public
How to customize redmine public
 
困らない程度のJDK入門
困らない程度のJDK入門困らない程度のJDK入門
困らない程度のJDK入門
 
私がドメイン駆動設計をやる理由
私がドメイン駆動設計をやる理由私がドメイン駆動設計をやる理由
私がドメイン駆動設計をやる理由
 

Similar a BtoCでバインド変数

Aurora MySQL HandMade Major VersionUp
Aurora MySQL HandMade Major VersionUpAurora MySQL HandMade Major VersionUp
Aurora MySQL HandMade Major VersionUpTakafumi Nakahara
 
Devsの常識、DBAは非常識
Devsの常識、DBAは非常識Devsの常識、DBAは非常識
Devsの常識、DBAは非常識yoku0825
 
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発infinite_loop
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Yoshinori Matsunobu
 
Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節Yuichiro Saito
 
VarnishCache入門Rev2.1
VarnishCache入門Rev2.1VarnishCache入門Rev2.1
VarnishCache入門Rev2.1Iwana Chan
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
B 2-1 はじめての Windows Azure
B 2-1 はじめての Windows AzureB 2-1 はじめての Windows Azure
B 2-1 はじめての Windows AzureGoAzure
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介Kevin Toyoda
 
SQL Server のロック概要
SQL Server のロック概要SQL Server のロック概要
SQL Server のロック概要Oda Shinsuke
 
Mongo dbを知ろう devlove関西
Mongo dbを知ろう   devlove関西Mongo dbを知ろう   devlove関西
Mongo dbを知ろう devlove関西Ryuji Tamagawa
 
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編Kazuya Numata
 
Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果Masayuki Ozawa
 
Amazon Aurora Deep Dive (db tech showcase 2016)
Amazon Aurora Deep Dive (db tech showcase 2016)Amazon Aurora Deep Dive (db tech showcase 2016)
Amazon Aurora Deep Dive (db tech showcase 2016)Amazon Web Services Japan
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニックinfinite_loop
 
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例terurou
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOneAdvancedTechNight
 
実はとても面白い...Documentation library
実はとても面白い...Documentation library実はとても面白い...Documentation library
実はとても面白い...Documentation libraryKouta Shiobara
 
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイントKentaro Matsui
 

Similar a BtoCでバインド変数 (20)

Aurora MySQL HandMade Major VersionUp
Aurora MySQL HandMade Major VersionUpAurora MySQL HandMade Major VersionUp
Aurora MySQL HandMade Major VersionUp
 
Devsの常識、DBAは非常識
Devsの常識、DBAは非常識Devsの常識、DBAは非常識
Devsの常識、DBAは非常識
 
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
 
Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節
 
VarnishCache入門Rev2.1
VarnishCache入門Rev2.1VarnishCache入門Rev2.1
VarnishCache入門Rev2.1
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
B 2-1 はじめての Windows Azure
B 2-1 はじめての Windows AzureB 2-1 はじめての Windows Azure
B 2-1 はじめての Windows Azure
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介
 
SQL Server のロック概要
SQL Server のロック概要SQL Server のロック概要
SQL Server のロック概要
 
Mongo dbを知ろう devlove関西
Mongo dbを知ろう   devlove関西Mongo dbを知ろう   devlove関西
Mongo dbを知ろう devlove関西
 
ヤフーを支えるフラッシュストレージ
ヤフーを支えるフラッシュストレージヤフーを支えるフラッシュストレージ
ヤフーを支えるフラッシュストレージ
 
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編
 
Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果
 
Amazon Aurora Deep Dive (db tech showcase 2016)
Amazon Aurora Deep Dive (db tech showcase 2016)Amazon Aurora Deep Dive (db tech showcase 2016)
Amazon Aurora Deep Dive (db tech showcase 2016)
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOne
 
実はとても面白い...Documentation library
実はとても面白い...Documentation library実はとても面白い...Documentation library
実はとても面白い...Documentation library
 
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント
 

BtoCでバインド変数