• ベストアンサー

Oracleのチューニングについて

あるWebアプリケーションの一部の処理が、最近極端に処理が遅くなったと感じているものがあります。 アプリケーションの仕様も変えていない(確実とは言えません)と思いますので、OracleDB側(チューニング)の問題ではないかと疑っております。 いろいろチューニングについて調べたところ、まず「データ・ブロック数を減らす」という点を確認しようと思っています。 無駄なブロック数を減らそうとした場合、暫定的な対応にはなりますが、一度データをtruncateしてからデータを再挿入すると、きれいな状態でデータブロックが再生成される、という認識でよいのでしょうか? (一度truncateしても処理スピードが変わらない場合は、「データブロック」の問題ではない、という判断で良いでしょうか?) 逆に上記で変わらない場合は、DB側で確認すべき点・何か原因として怪しいと考えられる点はありますでしょうか? 宜しくお願い致します。

  • liao
  • お礼率36% (87/240)
  • Oracle
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • sapporo30
  • ベストアンサー率33% (905/2715)
回答No.4

DBのパフォーマンスが悪くなった場合は、 1. アナライズを実行する。 2. SQLの見直しをする。    SQL trace を取って、FULL SCANしているような    SQL を見直す。 3. DBのチューニングをする。 というような感じです。 DB自体のチューニングを行う前に、アナライズをしたほうが いいです。(対して手間がかからないので) OracleDBは、検索パスを決めるのに、COSTベース オプティマイザ を使用しています。 そのCOSTを決定するのに、統計情報を使用します。 統計情報は、テーブルの件数やばらつきなどの情報です。 その統計情報を収集するのが、アナライズです。 古い統計情報のテーブル、スキーマだと、 極端にパフォーマンスが悪くなる場合があるので まず最初にしたほうがいいです。

その他の回答 (3)

  • sapporo30
  • ベストアンサー率33% (905/2715)
回答No.3

アナライズは実行されていますか?

liao
質問者

お礼

行っておりません。 (アナライズという言葉自体始めて聞きました・・・) OracleDBを導入時(業者さんに依頼)に設定を行ってもらった 以降はホッタラカシ状態となってしまっていますので、 定期的に行わなくてはいけないことだと、全く行っていない、 ということになります。 まずは、ANALYZEコマンドについて勉強するようにしたいと思います。 取り急ぎ、試してみたほうが良い、コマンドなどありましたら、 ご指示いただけると幸いです。 知らないことが多すぎで1から勉強しないとマズい状態のようです・・・

  • FudaKeji
  • ベストアンサー率73% (58/79)
回答No.2

データの更新(削除、追加も)を繰り返すことでデータが複数のブロックにまたがったりしてブロックの利用率が低くなることがあります。 TuncateしてImportすることで無駄な空き部分が詰まるために必要なデータを取得するためにスキャンするブロック数が減ります。 ってことで認識はあっていると思いますよ。 StatsPackは一度使うと簡単になるので是非勉強してみてください。 専用の表領域と専用のユーザーを作成し、sysで$ORACLE_HOME/rdbms/spcreate.sql を実行すればパッケージが作成されます。 その後、作成済みの専用ユーザーで exec statspack.snap; を2回実行し、今度は spreport.sql を実行。 パフォーマンスチューニングのマニュアルや、OiSC(サポート契約があれば)に情報が沢山有ります。 データが予想以上に増えている表とか無いですか?

liao
質問者

お礼

ご回答ありがとうございます。 StatsPackはまだ実行できていません。 (マニュアルを見たところをそれほど難しくないように感じてはいますが、業者さんにOracleを導入をしてもらった状況でそれ以降は構成はほとんどイジっておらず、私自身も表領域の作成等も行ったことがないため、実際に行うのに躊躇しております。まず表領域等の勉強から始めないと・・・ といった状況です) サポート契約もありますのでOiSCも参照可能です。 まずは勉強から・・・ といった状況です。 > データが予想以上に増えている表とか無いですか? ここで言う”データ”とは、(1)レコードの数、それとも(2)1レコード内のデータ×レコード数 の(2)のほうですよね? レコード数はあまり増えていませんが、1レコード内のデータ量は日々増えていますのでその辺は気にしております。(VARCHAR2で定義したカラム内のデータ) よって削除・追加は頻度としては多くありませんが、更新の頻度は結構あります。 ただレコード数はどのテーブルも5000レコード程度なので、索引があればそれほど時間がかかるものではないように思われるのですが・・・ 何かのタイミングで、索引から検索されなくなってしまった(全表走査になってしまった)ということはありえるのですか? またブロックの利用率でここまで処理が遅くなるのか(今まで4秒程度で応答があった処理が、現在は10秒ほどかかっているので、違う原因があるのかもしれません。 ブロック数の問題でこれほどの違いは考えられるものですか?

  • FudaKeji
  • ベストアンサー率73% (58/79)
回答No.1

tuncate→import を試す前にstatspackというキーワードを調査してください。 statspackではある2時点間の性能データを採取することが出来ます。 (1)statspack実行 (2)該当処理実行 (3)statspack実行 で(1)と(2)の間でどのような処理が実行されたかを確認出来ます。 まず暫定対応を行う前の状況を確認し、対応後のレポートと比較することで改善された場合の原因が特定できます。 データ量の変換に伴い実行計画が変化したことが考えられますが、まず現状の性能情報が必要です。

liao
質問者

お礼

ありがとうございます。 そうですね、まずは原因を究明するためにも状況を分析することを行うようにしたいと思います。 (statspackについてサラッと調べてみましたが、ちょっと難しそうな話なので、じっくり調べてから行うようにしたいと思います。) また勉強の為に知りたいのですが、全てのデータを一度truncateしてからデータを再投入すれば、データブロックの状態はきれいになる、という認識は間違っていないでしょうか?

関連するQ&A

  • OracleからDBを変更を考えた場合

    OracleDBを別のDBMSに変更しようとした場合、どんな候補が考えられるでしょうか? 条件としては 1.不定期にデータが発生してそれらを蓄積していく必要がある。 2.同時にDBへアクセスするユーザ数はせいぜい1~5. 3.Linuxベースでのシステム構築を考えている。 3.の点でAccessやFile Makerはありえません。 Linuxという点でMySQL、postgreSQLくらいかと思うんですが。 よいアドバイスがあればよろしくお願いします。

  • チューニング対象のSQLの見つけ方・「遅い」SQLの目安

    質問はずばり、SQLを「遅い」と判断する具体的な処理時間・判断基準は? です。前提は比較的単純なSELECT文とさせてください。 パフォーマンスチューニングする際などにはSTATSPACK reportをみてとりあえず 1回あたりの処理時間が遅いSQLやStatement Totalの 処理時間が長いSQLを ターゲットにしていくものだと思います。 しかし極端な話、単に上位といってもトップのSQLの処理時間が1msec以下だったらそもそも パフォーマンスチューニングは一切必要ないはずです。 逆にTOP10以下でも単純なSQLなのに1秒以上処理時間のかかるものが多数あった場合には 何か問題があるはずと考えチェックしていくべきだと思います。 もちろん、データ数や結合テーブル数・条件の複雑さによって一概には言えないことはわかります。 しかし、大体の目安というものはあるべきかと思います。 私のなんとなくの判断基準は 「軽めのものは0.03秒程度、重めでも0.2秒程度」かなーと思っています。 経験的なものでまったく根拠はありません。経験も大してありません。 なので、もう少し根拠のある数字もしくはもう少し経験のある方のご意見 を伺いたいと思い質問させていただきます。 よろしくお願いします。

  • Oracle 実行計画の読み方

    コメントあれば、よろしくお願い致します。 0 recursive calls 0 db block gets 7,800,000 consistent gets --select文でアクセスしたバッファキャッシュのブロック数。ディスクとメモリへの総アクセス数 A 3,500,000 physical reads --ディスク上のデータファイルにアクセスしたデータ要求の総ブロック数 B 0 redo size 219,000,000 bytes sent via SQL*Net to client 7,100,000 bytes received via SQL*Net from client 500,000 SQL*Net roundtrips to/from client 100 sorts (memory) --メモリ内でソートした回数 C 0 sorts (disk) 9,200,000 rows processed --処理対象となった行数 D 一番、重視しなければいけないのは、A だと思っています。 780万回もアクセスされていますが、 ブロック数が 8K に設定されている環境であったとして、 1024*8*780万 = 63,897,600,000約 63GB の i/o が一つのSQLで発生 B に関しても一応計算してみると、 1024*8*350万 = 28,672,000,000約 28GB の i/o が一つのSQLで発生 D に関しては、920万行という結果は分かるが、1行辺りの幅が分からないので、 幅を別途SQLから計算し、どういった負荷を与えている文なのかを分析する必要がある。 select statement optimizer=choose からの数十行には、 (FULL)が、(UNIQUE INDEX)に比較して、10倍ぐらい表示されていると仮定します。 それぞれの検索テーブルの件数ははっきりしていたとして(1件~2000万件ぐらい(400万件以上が5テーブル))、 何をどうするのがSQLチューニングでしょうか。

  • ファイルへのリンクの作成手法について(BLOBなどの利用)

    現在、OracleDBを利用してWebアプリケーションの開発を行っています。 作成予定のアプリは、 ある製品の一覧リストを作成して、そこからPDFファイルへのリンク、一覧に製品画像ファイルを表示、・・・ といったアプリケーションです。 そこで、PDF、画像ファイルの管理方法をどのようにしようかと悩んでおります。 方法としては、以下の2つの方法があるかと思います。 (1)ファイルはサーバにFTPでアップロードして、DB側でファイルパスを管理する。 (2)OracleDBにて、BLOBなどのデータ型を利用してDBのカラム内にファイルを格納する。 今社内にあるアプリは、(1)の方法が採用されているようですが、ファイルとパスを2重管理しなくてはいけない、という問題があります。 (2)については、たぶん技術的には可能だろうと思っていますが、今までにそのようなアプリを見たことが無いため、戸惑っております。 一般的にはどちらの手法が用いられるのでしょうか? また(2)の場合の問題点として、どのようなことが考えられますでしょうか? 以上、宜しくお願い致します。

    • ベストアンサー
    • Java
  • ORACLE接続速度

    ORACLEのデータベースにアプリケーションで抽出条件を選択して表示させるという環境があるとして、例えばその抽出条件に日付、名前、出勤態度の3項目を選択させ、実行させます。それで、名前の抽出条件だけAさん、Bさん、Cさんと順に表示させていくとした場合、Bさんだけデータベースに接続するまでの速度がめちゃくちゃ遅いという現象が発生しました。Aさんも、Bさんも、Cさんも、どの名前の人でもレコード数が同じ位なのですが、特定の検索条件だけ接続速度が遅くなることってありえるのでしょうか?もちろん、接続の際のアプリケーション側の処理は同じ処理が実行されます。 OSはWindows2000Proffessional 接続環境はODBC接続で、アプリケーションはVBで開発されたものです。

  • ネックの反りとオクターブチューニング

    エレキギターについて質問させていただきます。 現在使っているギターのネックが反っているか気になります。 ギターは、フェンダージャパンのストラトキャスター、ST58-80TXです。 ちょうど3年前に新品で購入したもので、それ以降修理や調整には出しておりません。 まず、目視による反りの確認ですが、 ボディを下、ナットを上にし、上から見下ろした時にペグが自分から見て右手側にくる状態にしました。 すると、指板の左端(1弦側)がどうも直線になっているようには見えません。 右にカーブしているように思えてしまいます。 反対に6弦側の指板の先端は一直線になっている気がします。 次に6弦1フレットと最終フレットを押さえて、中央部を見ると、弦とフレットの間に隙間があるかないかくらいです。 小指を目一杯伸ばして4フレットをたたくと、音がしました。 これは他の弦でも音がするのを確認できました。(弦とフレットの隙間は、2~5弦では確認しづらく、何とも言えません。) ストレート・エッジを持っていないので、ストレート・エッジによる確認はできませんでした。 そして、オクターブチューニングをすると、ほぼ完ぺきに合わせることができました。 ローポジションでのビリつきも、あまり気にはなりません。 そこで質問なのですが、オクターブチューニングが合う場合、ネックは反っていないものと考えてよいのでしょうか? 個人的には、目視によって指板の左端が右にカーブしているのが気になって仕方ありません。 オクターブチューニングが合っている場合でも、ネックのねじれや、左右に波打ちしているという可能性はありますか? もし、オクターブチューニングとネックの反りの間に何も関係がないとしたら、楽器屋さんに持っていこうと思います。 (自分の中では、勝手にオクターブチューニングがあっている≒ネックは反っていない、つまり目視の方が間違っているのではないか?という考えがあります。。。。この考え方は不適切でしょうか?) 質問が長くなってしまい、申し訳ありません。 回答よろしくお願いします。

  • ギターの開放弦のチューニングが合わない

    開放弦でチューニングすると、指板上でのチューニングが合いません。 開放弦より♯します。(この現象以前他のギターでも症状が現れ、未解決状態で放置) 12Fのオクターブチューニングが合わなかったので、サドルの位置や高さ調整したもののサドルをブリッジ側にめいいっぱい動かしましたが解決せず。 当然チューニング時に弦を強く押していたり、弦が相当古かったりなんてのはございません。 ネックの反りは若干順反り、少しずつ矯正中。 ヘッド側からブリッジ側へ覗く方法(正しいチェック方法ではありませんが)では特に大きな波打ちは無い模様。1Fと最終フレット21Fを押さえ8~12F辺りのフレットと弦のクリアランスは多少空いてるかな?具合。 そもそもナット部分の高さが高い。 目視でも高く見える上、3Fを押さえた時の1F上の弦とのクリアランスが結構開いておりました。 (松下工房さんが掲載していた確認方法) 試しに6弦のナットを削り高さをギリギリまで調整しましたが、フレットを押した時の♯方向へのズレは多少緩和したもののまだズレています。 それにしてもチューニングが合わないのでフレットの精度も疑いましたが、音のズレは0F(ナット)と1F間が極めて大きいので問題はやはりナットにあるのでは…と。 6弦で例えると、開放弦のチューニングで合わせると1FがFの約10セント♯、12FではEの約20セント♯。(ナット高さ調整+サドルをブリッジ側にかなり寄せた状態) ナット高さ調整する前、これはあくまで曖昧な記憶ですが、12Fで4~50セント(半音のさらに半分) くらいズレていたと思います。 ちなみに他のフレット上も♯しています。 こうなるとナットの位置が問題ありそうで。 ナットをブリッジ側へズラして開放弦のみ音を高くすれば解決すると思いますか? そもそも問題はナットにあるのでしょうか? シムの厚みネックの仕込み角も考えましたが関係ないかな?…と、 やはりナットくらいしか想像上考えられません… ギターは中古で買って来たTomson(古い!)のストラトです。

  • 古いテレビのUHFチューニングの方法??

    このたび同じ市内で、1戸建からマンションに引っ越して、テレビをつなぎなおしました。 が、なぜだかUHFが映りません。 型番は日立C29-NX10です。 配線は単純に部屋のジャック?から同軸ケーブル1本でつないでます。 VHFはきれいに出るので、以前の質問を見て思ったのですが、 このマンションのアンテナは、UHFの周波数を変えて各部屋に来てるアンテナなのかな・・・と。 そこで、UHFのチューニングをしなおそうと思ったのですが、 取説及びオリジナルのリモコンが紛失状態で、どうしていいのか分かりません。 前面にあるのは外部入力端子だけですし・・・。 この場合、再チューニングする方法はないでしょうか? テレビ、見たいです(ToT)

  • ランダムな値Xを4万と1万と千に無作為に区切る

    ご質問させてください 大体170~100,000までの間を取るX値を A:40,000、B:10,000、C:1,000の3種類の大きさのブロックにランダムに区切り A,B,Cそれぞれのブロックが何回使われたかを求めたいと思っています (全て0回、という場合も勿論ありえます どのような考え方で分割してゆくのがABCそれぞれにとって最も公平になるのか 考えてみたのですがどういった部分から手を付けてよいのかもよくわかりません 今の所 まずXを40,000(A)で暫定的に分割し、それぞれの暫定ブロックA'1,A'2,A'3...毎に50%で実際にそのブロックを生きとするかを決め 次に前の手順で40,000で割った際の余り+生きにならなかった暫定ブロック部分の合計をYとして Yを10,000(B)で暫定的に分割し...という方法にしています。 始めは40,000(A)で分割して、余った部分を10,000(B)で分割して...という方法にしていたのですが 値が大きくなってくると先にAのブロックが80,000を使い果たしてしまって、本来数が多くなるはずのBのブロックの数が Aとあまり変わらなくなってしまうという事態が発生してしまっていました。 なにぶんこういった問題につきあたるのが初めてなのでどういった単語で検索すれば必要な知識に行き当たるのかもよくわかっていません よろしくお願いいたします。

  • エレキギター:ダウンチューニングすべきか、それとも…

    いくつかコピーしてみたい曲があるのですが、どうやら全てチューニングがバラバラ(レギュラー、半音下げ、一音下げ、6弦のみ一音下げ…など)のようなのです。 過去の質問などを見ながら今考えてるのは、 [1]エフェクターで何とかなるんじゃないか [2]一回一回チューニング変えたらいいんじゃないか というニ案です。 普通に考えたら[2]が妥当案なのですが、気まぐれな性格なため、かなり頻繁にチューニング変更することになりそうな気がします。そうすると、ネックなどに何かしら負担がかかるような気がして不安です。 一方[1]に関しては、過去の質問を見る限り「ピッチシフターで原音を0にすれば対応できる」という回答と「ピッチシフターで対応するのは間違い」という回答があり、どちらが正しいかの判断で迷っています。 エフェクター自体は買う予定(ZOOM GFX-5)があるので、もし頻繁なチューニング変更がギターに負担であるなら[2]で対応できたら、とも考えてます。ただしまだ試奏などしてないので、この機種でそんな使い方が可能かは不明な状態です。 そこでみなさんに聞きたいのは、 ・頻繁にチューニングを変更した場合、ネック等に負担がかかるかどうか ・ピッチシフターでダウンチューニングの代用が可能か(できれば実際に代用した場合、具体的にどんな問題があるか指摘していただけると幸いです) の2点です。また上に書いた[1]も[2]も無謀である場合、何か代わりとなるアイディアがあればご教示いただければ幸いです。 よろしくお願いしますm(_ _)m ※参考として…↓は、購入予定のエフェクター、ZOOM GXR-5です。 http://www.comeon.co.jp/shop/effector/gfx-5.htm