• ベストアンサー

Oracle 実行計画、統計情報の見方

実行計画や統計情報を取得した結果の 簡単な見方があればサイトなど教えてください。 実行計画を取得して どんなSCANやINDEXの利用されているかがわかっても、 何SCANなら速いとかがわからないので、 結局、何を採用すればいいかわかりません。 統計情報でもconsistent getsが ブロックに対する読み込み一貫性が要求された回数とわかっていても、 その値が少なければいいのか、 どの値を優先的に見ればいいのかがわかりません。 情報の取得は出来ても分析の仕方がわからない状態です。 簡単にわかる方法があれば教えてください。

  • Oracle
  • 回答数2
  • ありがとう数16

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

  • ベストアンサー
  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.2

Oracleのパフォーマンスチューニングガイドに、基礎となる情報が書かれていますので、お読みになることをおすすめします。 正確な基礎理論が書かれてありますので、きちんと理解すれば自然とチューニングできるようになります。 また、どのSCANが速いか、というのはもちろん場合によって異なってくるので、まずは仕組みを理解するようにしてください。 ガイドはなれるまでは若干読みにくい(むずかしい)ところもありますが、頑張ってください。

参考URL:
http://otn.oracle.co.jp/document/products/oracle10g/101/doc_cd/nav/portal_4.htm
limelife
質問者

お礼

返答が遅くなりすいません。 参考URLありがとうございます。 OTN登録はしているんですが、 このようなページがあるとは知りませんでした。 活用させていただきます。

その他の回答 (1)

  • kozai_001
  • ベストアンサー率58% (18/31)
回答No.1

Oracle SQLチューニング講座を紹介します。 第5回 SQLチューニングの基盤となる統計情報に統計情報の意味がかかれています。 ここだけ読まれても基本的な考え方を理解できていないと意味を理解できないと思われます。 結構量がありますが、最初から読まれることをお勧めします。 実際のチューニングも書かれていますので参考にされればいかかでしょう。

参考URL:
http://www.atmarkit.co.jp/fdb/index/index-db.html#tuneorasql
limelife
質問者

お礼

kozai_001さんありがとうございます。 一度じっくり見てみます。

関連するQ&A

  • 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チューニングでしょうか。

  • 統計情報について

    以下の統計情報ですが、各項目が具体的にわかる資料は何を見たらわかりますか? ちなみに「consistent gets」が多いと重いのかなぁと考えてる程度の知識です。 宜しくお願いします。 ---------------統計情報------------------------ 統計 ---------------------------------------------------------- 187 recursive calls 0 db block gets 176479 consistent gets 63028 physical reads 0 redo size 391 bytes sent via SQL*Net to client 503 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 1 rows processed ---------------統計情報------------------------

  • Oracle 実行計画について

    数千万件が格納されているテーブルにINDEXキーを新設して そのINDEXキーを条件句にもつSQL文にヒント句をつけて必ず参照するように変更し、 実行計画を取得したら、新設したINDEXキーを参照してはいるのですが、 逆にRowsやBYTESなどが増加してしまいました。 Rows | Bytes | Cost ⇒ Rows | Bytes | Cost    1 |  23  |  5      2862 |65826 |  16 ただ、体感速度はINDEXキーを新設した方が早いです。 この場合考えられる原因とは何がありますか? Oracle11gです。

  • SQLの実行計画の取得について。

    SQLの実行計画の取得について。 一つ目の質問 実行計画にはコストベースとルールベースがあるようですが、実行計画を取得した時にcostいくつとでるのはコストベースなのでしょうか? それともここでいうcostは単純にパフォーマンスの指標みたいなものでコストベースだろうがルールベースだろうが、costの数値をチューニングの目安にするのでしょうか? もし前者の場合だとすると、ルールベースの目安はどのように確認するのでしょうか。 二つ目の質問 ネットで調べると、コストベースは統計情報というものを参考にして実行計画を決めるとありました。 ということは本番で想定されるデータ量をDBにいれて統計情報を取得して実行計画を確認しないと意味がないということでしょうか? 統計情報が保持される表も表に過ぎないから、本番からコピーすればOKという記述もありましたが、新規システムの場合は自分で必要なダミーデータを作成するものなのでしょうか。 よろしければアドバイス頂けると助かります。 データベースはDB2 Express-C 9.7になります。

  • oracle10g統計情報取得の確認方法

    Oracle 10gで統計情報が取得されたことを確認するSQL文を教えてください。 統計情報の取得方法としては、 Primary Key、Indexを再作成した後、DBMS_STATS.GATHER_SCHEMA_STATSを使用して統計情報を取得しております。 よろしくお願いします。

  • 大量にデータを更新するテーブルの統計情報について

    大量にデータを更新するテーブルの統計情報の取得タイミングについてついて質問があります。 該当のテーブルはワークテーブルでテーブルの1/3程の大量データを毎回delete,insert,selectの順番で処理をおこなっています。 大量のデータを毎回更新しているのでselect文の際に統計情報が古いため実行計画が正しくなく処理が遅くなる可能性があるのでは無いかと心配しております。 統計情報は、取るべきでしょうか?取る場合は何時のタイミングで取るべきでしょうか? Oracle 9iを使用しています。 宜しくお願い致します。

  • コストベース・オプティマイザについて。

    オプティマイザには、  1)ルールベース・オプティマイザ(RBO)  2)コストベース・オプティマイザ(CBO) があります。 RBO は、決められたアクセスパスの優先順位に従って 実行計画を選択することが分かりました。 CBO は、最適なアクセスパスを選択する為に、 オプティマイザ統計を取得し、実行計画のコストを 見積もることが分かりました。 ★このオプティマイザ統計に関して、質問があります。  オプティマイザ統計は、ANALYZE や DBMS_STATS パッケージを  使用することで取得する統計情報ということが分かりました。  しかし、統計情報を取得することでどのように実行計画が  改善されるのか、この部分のイメージが掴めません。 ================================================================ 例えば、表の統計情報を取得すると、以下のようになりました。 SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE,CHAIN_CNT 2 ,AVG_ROW_LEN 3 from user_tables where table_name='EMP'; NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN ---------- ------ ------------ --------- ---------- -----------   15 5 0 0 0 35 ================================================================  それぞれのカラムの意味は以下であることが分かりました。   《上記のカラムの説明》   NUM_ROWS   = 行数   BLOCKS    = 使用ブロック数   EMPTY_BLOCKS = 未使用ブロック数   AVG_SPACE  = 空き領域の平均サイズ(bytes)   CHAIN_CNT   = 行連鎖・行移行の行数   AVG_ROW_LEN = 行の平均長(bytes)    上記の統計情報を取得することで、どのように実行計画を定めているのでしょうか。  統計情報を取得することで、どのような意味があるのでしょうか。  宜しければ、教えて頂きたいと思います。

  • 統計情報取得

    毎朝DBMS_STATS.GATHER_SCHEMA_STATSにて統計情報を取得しているのですが、ある時からあるテーブルをSELECTするとIndexを利用すれば早く検索できるのに全件検索するようになってしまいました。 突然このような現象におちいるのはよくあることなのでしょうか? また同様な事象が発生した方がいれば対応策など教えて下さい。 ちなみに、OSは Solaris9 で、Oracleのバージョンは 9i です。

  • oracle:統計情報とテーブル削除

    oracle10gを使用しております。 統計情報について質問させていただきます。 テーブルAについて、[statistics = none]を指定しExportします。 統計情報取得コマンドを実行します。 analyze table TABLE_A compute statistics; 後に、テーブルAを削除します。 drop table TABLE_A; バックアップファイルを基に、テーブルAをImportします。 このとき、テーブルAの統計情報はExport実行時と同じになるのでしょうか?

  • INDEX作成による更新系の影響範囲

    環境:Oracle9i 9.2.0.1 言語:VB6 システム:受注管理システム ある業務アプリの性能改善の為、顧客マスタにインデックスを作成したいのですが、更新系の処理が遅くなることを嫌ってなかなか承認が下りないです。 そんなに負荷はかからないと思うのですが、実際インデックスを1つ作成するとどの程度影響があるのか客観的に証明できないから困っています。 上記の業務アプリは毎日使用しています。 データ件数は100万件程度です。 参考までにインデックス作成前のINSERT文実行した実行計画とインデックス作成後のINSERT文実行した実行計画を記述します。 作成前 統計 ---------------------------------------------------------- 86 recursive calls 26 db block gets 14 consistent gets 29 physical reads 2956 redo size 628 bytes sent via SQL*Net to client 825 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 4 sorts (memory) 0 sorts (disk) 1 rows processed 実行後 統計 ---------------------------------------------------------- 281 recursive calls 27 db block gets 73 consistent gets 20 physical reads 3044 redo size 633 bytes sent via SQL*Net to client 825 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 7 sorts (memory) 0 sorts (disk) 1 rows processed そんなに影響がないということを証明したいのですが、上記統計で大したことないと証明できますでしょうか?