アプリケーション開発 データベースコンサルタントのノウハウちょい見せ

Oracle RDBMSなどのオラクル製品や各種インフラ技術(OS、ストレージ、ネットワーク)といった話題を取り上げます。著者は小田圭二、「門外不出のOracle現場ワザ」、「絵で見てわかるOracleの仕組み」、「絵で見てわかるOS/ストレージ/ネットワーク」などの著作もあります

ホーム > カテゴリー - アプリケーション開発

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | トラックバック(-) | コメント(-)

(紹介)バインド変数化すべきでないときがある


突然のSQLパフォーマンスダウンを防ぐためのバッチ処理SQLリテラル化のススメ」という記事があり、SQLで起きるトラブルの1つを説明しているので、ご紹介したいと思います。

バッチ処理において、SQLはバインド変数化すればいいという訳ではないことを
説明してくれるブログです。リテラル化すべきケースがあることを説明してくれています。

「バインド変数化することで、たとえば、インデックスアクセスが好ましいSQLと、フルスキャンが好ましいSQLが同一のSQL(カーソル)となり、たまたまキャッシュに載っている実行計画が逆の場合に、性能劣化を経験する」という内容です。

まずは上記の記事を読むことをお勧めします。著者の方には、こういう記事をどんどん書いてもらえればと期待します。

■私なりのコメント

私もこの問題は見たことがあり、「全ての値をバインド変数化するべきとはかぎらない」とお客様には説明しています。一般的に、常に同じ固定値で使用するような値は、バインド変数化はさせないのがお勧めです。プログラム側でのバインド変数のセットなども面倒ですしね。

ちょっと詳しい人は、「なんで起きるの?」と思うかもしれません。そこで、発生しやすい条件をもう少し補足します。
傾向として、単一表に対して、いろんな列をバインド変数化してある「何でも来いSQL」ほどこの事象を起こしやすいと感じます。この意味でも、「全ての値をバインド変数化するべきとはかぎらない」と思います。また、単純な「=」条件の検索ではなく、レンジスキャン(範囲検索)の使用も、この問題ではよく見られます。
※最悪なのは"列 >= :x & 列 <= :y"となっていて、xとyに同じ値を指定して、1件検索していたりするケースです。SQLを流用しているといえば、流用しているのでしょうが。。。

この問題を起こすのは、意外とSQLの共通部品化を進めている組織でおきるようです。というのも、「このSQLとこのSQLは共通化できるなあ」とか、「おっ、このSQLは既に他のチームでも登録されているSQLでも対応できる。これを使うようガイドしよう」をすると、フルスキャンが良いケースなのに、インデックスが良いケースが混ざって、実行計画が不安定化するからです。

なお、11gからのデフォルト設定で働く、「優れたカーソル共有」では、このようなケースにおいて、カーソル(≒実行計画)を共有すべきではないと判断して、別々のカーソルにすることがあります。インデックス or フルスキャン の選択であれば、大抵はうまく対応してくれるはずです。

調査方法としては、AWRやStatspack(Level6以上)で当時の実行計画を調べると、実行計画が時々で変わっている様子がわかるはずです(v$ビューだけでは当時の情報は判らないです)。

P.S. 記事の間があいてしまいすみません。。。多忙すぎました。
スポンサーサイト

名著「SQLパズル」の紹介

ある程度、SQLが上手に書けるようになったらお勧めのSQLの本があります。
それが「SQLパズル 第2版」です。

数多くのパズル(問題ですね)を例に、どう考えるかという説明があり、さらに、どういう投稿があり、どうさらに改善されたかをひたすら紹介しています。ワインバーグの本と同様に、ひたすら考えさせられます。

新人にSQLを教えていた時期もありますが、新人(社会人になったばかり)に聞くと、「SQLはパズルみたいで面白い」と言っていましたが、確かにパズルの一面があります。

SQLに対して深い知識と発想(考え方)を手に入れたい人向けの本です。機会があればぜひ手に入れてください。

※前回の記事もそうでしたが、当面、内容の少ない記事が続いたり、もしかすると投稿をスキップするかもしれません。しばらくすれば元に戻れると思うので、ご了承ください。

開発したシステムをパッケージソフト化して売ろう・・・という話の良くある顛末

苦労してお客様のために開発したシステム、その打ち上げのタイミングで話題に上る(もしくは上層部からアイデアが出る)のが、「このシステムをパッケージ化して他社に持って行こう。そして元を取るのだ!」だと思います(私の偏見でしょうか・・・)

でも、でもですよ、世の中はそんなに甘くないと思うんです。同じ業務でも、会社ごとに業務要件は相当異なります。また、システム間連携にいたっては千差万別です。ユーザーインターフェースなんて、ユーザーの好みで変わっちゃいます。それと、パラメータ設定で動作を変えるようなアプリケーションのテストって大変ですよ。このパラメータ値のときのこのテストケースといったように掛け算になるので、正直やってられません。蓋をあけてみれば、「この機能は無いの? じゃ機能追加ね」ばかりで、ほとんどスクラッチのようになります。

確かに、横展開がうまい会社も一部にはあります。でも、大抵は取らぬ狸の皮算用ですよ。転んでもタダでは起きないという考えは大事ですが、甘い計算はしちゃいけないと思います。

エンドユーザーから「うちで儲けようと思わず、うちでノウハウを身につけて、パッケージ化するなりして、他社で儲ければいいじゃないか。うちに対しては投資だよ投資」と言って、法外な値引きを暗に要求する会社もありますが、横展開はそううまくは行かないんです。ちゃんとお金を払ってくださいね!

P.S. 同様のことが、自社フレームワークや(自社)共通ライブラリにも言えると思います。素直に、世の中のものを使い捨てした方が効率が良いと思います。はい。

自社フレームワークの悲しい話については、DBマガジン2006年11月号「アーキテクトを笑え」に「あるある」とうなずける話が載っています。これから自社フレームワークなどを作る方はぜひお読みいただきたい内容です。

PreparedStatementとStatementのメリデメ

たとえば、Javaであれば、PreparedStatementなどを使用すると、SQLの共通化・再利用により主にDBサーバーの負荷をある程度下げられることが良く知られています。

実は、これ、繰り返し利用されるSQLの場合に当てはまります。一回や数回程度しか用いられないSQLについてはPreparedStatement よりもStatementの方が軽量(高速)であるという話もあるんです。このStatementの方が速いケースというのはあまり知られていないと思います(参考となる文献:「Javaパフォーマンスチューニング 第2版」 オライリー刊 P501ページ)。

なお、PreparedStatementには、SQLインジェクション対策という面もあるため、必要に応じてエスケープ処理は実施する必要があると思います。

APサーバーの場合、PreparedStatementキャッシュが負荷を下げるためには効果的ですよね。
プロフィール

odakeiji

Author:odakeiji
小田圭二 日本オラクルのテクノロジーソリューションコンサルティング統括本部においてデータベースのコンサルタントをしている。今までのキャリアでは、社内教育部隊で、データベースやOS、ネットワークを教える経験を5年ほど積んだり、コンサル部門で主にDB(インフラ含む)のコンサルを10年程度経験した。また、コンサルタントとして、主に大規模ミッションクリティカルシステムを担当。社内では”火消し”とも呼ばれ、システムトラブルの火消しをいくつも担当していたこともある。
ポリシーは、「OracleもOS上で動くアプリケーションにすぎない。だから、OS、ストレージ、ネットワークを学ぶべき。アーキテクチャから考えろ」。
スキル面の興味は、アーキテクチャ、DBA、インフラ技術、教育、コンサル手法など。
本ブログのポリシーは「週に1回、DBAやインフラ担当者の役に立つ記事を書きたい」です(守れるだけ、守りたい・・・・)
なお、本ブログにおいて示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。ご了承ください。

私の主な著書の紹介です。もしよかったら、お役立てください。他にもオライリーなどがあります

●「絵で見てわかるOS/ストレージ/ネットワーク データベースはこう使っている」小田圭二 著
私のポリシーである”DBMSもOSの動くアプリケーションに過ぎない”に基づいて、OSとDBMSの関係、ストレージとDBMSの関係、ネットワークとDBMSの関係、を解説した珍しい書籍です。DBを学んでひと段落したら、DB使いもインフラ全体を意識しなければなりませんが、そのような人にお勧めです。企業ユーザー向けのIT本としては、2008年度翔泳社No1だとか(最後は出版社談)。

●「絵で見てわかるOracleの仕組み」 小田圭二 著
教育に携わる者としての私の思い「丸暗記するな。アーキテクチャを知るべき。絵で説明すべき」を具体化した、Oracleの入門書です。Oracle初心者向きですが、Oracleの基礎となる部分の動きを解説しているため、バージョンに依存せずに何年先でも使えます。逆に、本書の内容を理解せずに、ひたすら丸暗記すると応用力が身につきません。この本を読むだけで何かできるようになるわけではありませんが、アーキテクチャを身につけて、本当の技術力を身につける第一歩として欲しいと思っています。

●「44のアンチパターンに学ぶDBシステム」 小田圭二 著
本書は、企業のDBシステムの設計/構築から運用管理、プロジェクト管理までの各フェーズにおけるトラブル(失敗)事例について、アンチパターン(べからず集)とその回避策/防止策として解説するものです。チェックリストとして使っていただいても構いません。分かっていてもアンチパターンは避けられないことも多いものです(政治とか)。そういう方には、同じ仲間は多いのだなと再認識していただくための一服の清涼剤としていただければと思います。

●「門外不出のOracle現場ワザ」 小田圭二 他 著
一番最初に出た本です。結構とがった内容を扱っています。
・パフォーマンス分析の考え方(私の担当)
・性能テストや障害テストの仕方、設計の注意点(主に私が執筆)
・コストベースオプティマイザ(10gベース)のアーキテクチャ
・コネクションプーリング
最新のOracleの内容は含んでいませんが、今でも性能の考え方やオプティマイザの考え方は使えるはずです。オプティマイザをここまで解説している本を私は知りません。

●「続・門外不出のOracle現場ワザ」 小田圭二 他 著
「続」の名前の通り、次に出た本です。ちょっと尖り過ぎたかもしれません^^; でも本当に使う内容を選んだつもりです。一流になりたい・他の人と差をつけたい人にお勧めでしょうか。
・性能の良いSQLの書き方
・文字化けの仕組み
・障害(特に性能やハング)の分析・対応方法(私が執筆)
・障害をリアルタイムに分析・対処する方法(私が執筆)
・オプティマイザの使い方ノウハウ
・アップグレードのノウハウ

●「データベース」小田圭二 他 著
私にしては堅い本です。なんせ、共同執筆者が大御所の國友義久先生です。階層型DBMS、ネットワーク型DBMS、リレーショナル型DBMS、XMLDBMS、OO(オブジェクト指向)DBMS、DBMSの持つ機能、DBMSのセキュリティ、データベースの著作権、監査、モデリング、正規化といった内容を網羅しており、深い記述は無いものの、DB技術全体を抑えるのに向いている一冊です。ある程度技術力がついたエンジニアの方が、DB全体を振り返りたい(勉強したい)というときの最初の1冊としてお勧めです。



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。