しばちょう先生の試して納得!DBAへの道 indexページ みなさん、こんにちは。“しばちょう”こと柴田長(しばた つかさ)です。前回に引き続き今回もオプティマイザ統計収集の管理についてご紹介していき … ■ 1.

OracleDatabaseの「統計情報」とは何か?なぜ取得するのか?運用方法とは?について紹介します。, この記事でOracleDatabase初心者でも分かりやすく統計情報について紹介していますので、, その他DB全体・OS上の情報も統計情報としてOracleDatabaseへ保存します。, 統計情報はOracleDatabaseのオプティマイザーが作成する「実行計画」を作成するためのINPUT情報として使用されます。, 統計情報が存在しないと最適な実行計画が作成されないため、SQLが性能劣化する可能性が高くなります。, ただし「統計情報を取得していない」または「統計情報が古い」イコール「性能劣化」というわけではないので注意しましょう。, それぞれに特性があり、メリット・デメリットも存在しますので正しく使いこなす必要があります。, また「統計情報を固定化すればSQLの性能劣化は発生しない」というのも間違いになります。, 正しい知識をもって正しい統計情報運用することでデータベースをヘルシーに保つことができます。, TodoONada株式会社というIT企業の代表取締役 all rights reserved. 津島博士のパフォーマンス講座 第78回 Oracle DatabaseのJSONについて, Maximum Security Zonesで、クラウドのセキュリティ対策の弱体化を防ぐ. もし列に対する統計情報がなければ「col1 > 10」の選択率はORACLEは予測できないため、インデックススキャンとテーブルフルスキャンどちらが早いかを判断することはできません (ダイナミックサンプリング機能はここでは考慮しません)。 SQL>exec dbms_stats.purge_stats (to_timestamp('2019/05/30 23:59:59','YYYY/MM/DD HH24:MI:SS')); SQL> exec dbms_stats.purge_stats (DBMS_STATS.PURGE_ALL); システムエグゼの社員が執筆するコラムや読み物など、技術関連のお役立ちコンテンツです。, システムエグゼが出展する展示会情報や開催予定のセミナー・イベント情報はこちらからご確認いただけます。, 各種メディアへの掲載情報、システムエグゼからのお知らせや最新ニュースをご紹介します。, 第18回:現役DBAが解説 ~運用保守編~ Oracle Databaseのアーカイブログの運用について, 第17回:OracleDatabaseで異なる文字コード間におけるデータ移行時の注意点, 第16回:Oracle Cloud Database ServiceのDBに直接接続してみた(検証編), 第15回:Oracle Cloud Database ServiceのDBに直接接続してみた(説明編), 第14回:オンプレOracle DBからRDS for Oracle(AWS)への移行, 第8回:Oracleバックアップの速度改善(Oracle Recovery Manager 編), 第2回:PostgreSQL-カンマ区切りデータの変換(regexp_split_to_table). TBL2表の11レコードを更新した後、統計情報が失効していることを確認して下さい。, TBL2表の11レコードを更新するのは問題ないと思いますが、上記の回答例の中で、SYSユーザーで接続してDBMS_STATS.FLUSH_DATABASE_MONITORING_INFOプロシージャを実行しています。これはマニュアルに説明があるように「メモリ内のすべての表の監視情報をディクショナリにフラッシュ」するプロシージャであり、Oracle Databaseは定期的に表の更新履歴をメモリからディクショナリにフラッシュしますが、それを待機せずに手動でフラッシュすることが可能です。今回は検証の都合上、表の更新直後にUSER_TAB_MODIFICATIONSディクショナリ・ビューを確認する為に実行していますので、通常は実行する必要が無いプロシージャです。, USER_TAB_MODIFICATIONSディクショナリ・ビューを参照することで、表毎の更新(INSERT/UPDATE/DELETE)されたレコード数等確認することが可能です。今回の演習ではTBL2表の11レコードをUPDATEしたので、その結果がそのまま出力されていることが確認できたかと思います。非常に便利なビューなので、私はパフォーマンス・チューニングの際に各表がアプリケーションからどのように更新されるのかを把握する一つの手段として、このビューを参照することがあります。, ただし、ここで驚いていてはいけません。演習問題としては「統計情報が失効していることを確認する」でしたので、それを確認してみましょう。演習2においてDBMS_STATS.GATHER_SCHEMA_STATSプロシージャで統計情報を収集しましたが、このプロシージャにはもう一つの用途が存在し、「統計情報が失効」もしくは「統計情報が空」と判別されたオブジェクトの一覧を抽出することができてしまうのです。では、解説しますね。, 改めて、マニュアル「PL/SQLパッケージ・プロシージャ及びタイプ・リファレンス」でDBMS_STATS.GATHER_SCHEMA_STATSプロシージャを参照してみると、引数が異なる構文が2つ記述されていていることに気付くと思います。ぱっと見てしまうとほとんど同じ引数が指定されているように思いがちですが、データ型の列をじっくり見ていくと「OUT」と記述されている「objlist」パラメータなるものがあるではないですか。ということで、これを使用します。とは言え、データ型が「ObjectTab」と意味不明な記述になっていることに不安を感じてしまいますよね。今回はこういったものをどのように読み解くのかも解説しておきます。プロシージャをご自身で作成されたことが有る方はご存知だと思いますが、各PL/SQLパッケージには独自のタイプが定義されていることがあります。そして、まさに「ObjectTab」はDBMS_STATSパッケージ独自のタイプであり、きちんとマニュアルに次のような記載があります。, ここでのタイプ「ObjectTab」は、スキーマ名、オブジェクト・タイプ、オブジェクト名、パーティション名、サブ・パーティション名を構成要素とするObjectElemで定義されたレコードを複数行格納するメモリ上の表のような入物だと認識してください。, と言うことで、GATHER_SCHEMA_STATSプロシージャを実行する際、「options」パラメータに「LIST STALE」を指定することで統計情報が失効したと判断されたオブジェクトの一覧が抽出されますが、その結果を格納する為に「objlist」パラメータにObjectTabタイプの変数を指定する必要があるのです。上記の回答例では、TRYスキーマのTBL2表の統計情報が失効していると判断されていることが確認できたかと思います。, ちなみに、「options」パラメータに指定可能な値は次の7つであり、デフォルト(optionsを明示的に記述しない)では「GATHER」が選択される為、スキーマ内の全てのオブジェクトの統計情報を収集してくれているのです。意外と知らないですよね。, さらに、ちなみにですが、表毎の更新履歴はメモリ上に保持されていて定期的にディクショナリへフラッシュすると説明しましたが、最新の監視情報(更新履歴)がディクショナリにフラッシュされていないタイミングで「options => 'GATHER STALE'」で統計情報を収集しようとした場合、どうなるの?DBMS_STATS.FLUSH_DATABASE_MONITORING_INFOプロシージャを実行した後に、統計情報の収集をした方がよいの?という疑問を持たれた方は非常に鋭いです。答えは「気にする必要なし」になります。理由は、GATHER_*_STATSプロシージャを実行すると、監視情報が内部処理で自動的にフラッシュされるからです。これも実はマニュアルに掲載されているのですね。マニュアルを読む必要性を少しは納得して頂けましたかね。, ■ 4. Gold DBA のセミナー、Oracle Certified... 津島博士のパフォーマンス講座 Indexページ ▶▶ TRYスキーマ内の全てのオブジェクトに対して、統計情報が失効したと判断する閾値を5%に変更して下さい。, 折角の機会なので、統計情報が失効したと見なす閾値をデフォルト値から変更する方法も体験しておきましょう。, 特定スキーマ内の全てのオブジェクトに対してデフォルト値を変更するには、DBMS_STATS.SET_SCHEMA_PREFSプロシージャとなります。また、失効の閾値は「STALE_PERCENT」パラメータになるので、引数「pname」にこれを指定し、変更後の値を引数「pvalue」に指定します。, この変更が適用されているのかを確認する為には、DBMS_STATS.GET_PREFSファンクションを使用します。それほど難しくは無いと思うので、説明は割愛させて頂きます。結果的には、TRYスキーマ内の全ての表(TBL1、TBL2、TBL3)のSTALE_PERCENTが5%に変更されていることが確認できたかと思います。, ■ 6. OracleDatabaseの「統計情報」とは何か?なぜ取得するのか?運用方法とは?について紹介します。OracleDatabaseを運用して上で最も重要な要素の1つです。 この記事でOracleDatabase初心者でも分かりやすく統計情報について紹介していますので、「統計情報」の概要をしっかりと学んでいきましょう。 はじめに. ⇒データ肥大化のため削除に時間が掛かりすぎるため削除出来ない。 統計情報履歴を一括でPURGEする。 OracleのプロシージャにはPURGE_ALLも用意されており統計情報履歴を一括で削除する場合にはこれを利用することが出来る。(Oracle 11.2.0.3 以降で利用可能) 0. Oracle の統計情報に影響するパラメーター ... バージョン対応のジオデータベースを使用する場合は、圧縮処理を定期的に実施して古い情報を削除し、ジオデータベースのコンテンツをメンテナンスする必要 … Oracle University 無償オンラインセミナー(11月) エンジニアと社長業を7:3の割合でやってます。 OracleDBの統計情報の取得・更新方法「DBMS_STATS.GATHER_XXXX_STATS」を紹介, 動的パフォーマンス・ビューが参照している動的パフォーマンス表などの固定オブジェクト, cpuspeednw(1秒当たりのCPU平均サイクル数)、ioseektim(I/Oのシーク時間)、iotfrspeed(1回のI/O要求での速度).

Oracle 10g ではオプティマイザ統計情報の収集機能がかなり強化され便利になりました。 中でも一番便利になったのは、デフォルトで1日1回オプティマイザ統計情報の自動収集が行われるようジョブがスケジューリングされるようになったことです。 oracleデータベースでユーザー(スキーマ)を作成・変更・削除する方法をお探しではありませんか? 本記事では、ユーザー(スキーマ)を作成・変更・削除する方法を紹介しています。sqlサンプルもあるのでぜひ参考にしてください。

TRYスキーマ内で統計情報が失効しているオブジェクト(TBL2)のみの統計を収集するように、OPTIONSパラメータを適切に設定してDBMS_STATS.GATHER_SCHEMA_STATSプロシージャを実行してください。, 既に演習2で解説していますので、あとは試すだけですね。「options => 'GATHER STALE'」を設定してGATHER_SCHEMA_STATSプロシージャで統計情報を収集してみた結果、統計情報が更新されているのはLAST_ANALYZED列から判断して、TBL2表だけであることが確認できたと思います。, この統計情報の失効を判断する機能をフル活用すれば、実データにほとんど変更が無い表は統計情報を再収集する時間やリソースを省くことが可能になるので、冒頭にも記載させて頂いた通り、日々の統計情報収集に要する時間の短縮が実現できそうですよね。, ■ 5. - CYBER SECURITY)による"Prevent a weak cloud security posture with Maximum 前回の投稿から間が空いてしまいましたが、今回はOracle Databaseの「実行計画」についてお話ししたいと思います。例のとおり、今回もわかりやすさ追求のため、詳細を省略しているところがある点ご了承願います。 統計情報の作成 . みなさん、こんにちは。“しばちょう”こと柴田長(しばた つかさ)です。前回に引き続き今回もオプティマイザ統計収集の管理についてご紹介していきます。, 前回の演習ではオプティマイザ統計情報の収集時間を高速化するOracle Database 11gの新機能を体験して頂きましたが、今回は効率化という観点で、統計情報の収集時間を短縮削減する機能をご紹介したいと思います。統計情報が実際に格納されているデータの特徴にどれだけ近いかという精度がオプティマイザに最良な実行計画を選択させる為には不可欠ですが、統計情報をどのような頻度で取得する必要があるのでしょうか?極端な話をすれば、ある表のレコード数が1件増えただけで統計情報を再取得する必要性は感じませんよね。逆に、レコード数が2倍、3倍と大幅に増加した場合には、再取得した方が良さそうだという感覚は理解し易いかと思います。, では何%が閾値なのか。この一般的な解として、Oracle Database 11gでは表の既存レコード数の10%(= デフォルト値)が更新された場合、その表の統計情報が失効したと自動的に判断する仕組みを持っています。そして、この情報を基に失効したオブジェクトに限定した統計情報の再取得が可能である為、日々の統計情報収集に要する時間の短縮を実現します。, と、いくら言葉で紹介していても実際のオペレーションが分からなければ利用することができませんので、以下の演習をこれまでの演習で使用したOracle Database 11g Release 2 Enterprise Editionのデータベースで試してみてください。

Oracle University の無償オンラインセミナーに参加しませんか。11月は限定で ORACLE MASTER Please try again. 皆さんこんにちは、今年は10月から気温が低いので、日々の急激な寒暖差に身体がついていけませんね。今回は、Oracle... ※本記事は、Paul Toal (DISTINGUISHED SOLUTION ENGINEER

統計情報の作成は dbms_stats.gather_〜_stats シリーズを利用する。 analyze には フリーリストブロック、validate、行移行、行連鎖 に関する cbo に関係のない情報の取得の機能だけが利用を許されている。(oracle 10g 時点) テーブル統計の収集 Copyright© SystemEXE,Inc. TRYスキーマ内の全てのオブジェクトの統計情報を収集し、各表のオプティマイザ統計情報が収集されたことを確認して下さい。, まずは、TRYスキーマ内の各表にオプティマイザ統計情報が存在するか否か、存在する場合にはその統計情報はいつ収集されたものなのかを確認しています。その結果、前回の演習で作成したTBL1表では7/18に収集した統計情報が存在していて、今回の演習1で作成したTBL2表とTBL3表では、統計情報が空の状態であることが確認できます。, 次に、TRYスキーマ内の全てのオブジェクトの統計情報を収集する為、DBMS_STATSパッケージのGATHER_SCHEMA_STATSプロシージャを実行します。引数のパラメータとしては、スキーマ名を指定する「OWNNAME」のみを設定しており、特にデータのサンプリング率を指定する「ESTIMATE_PERCENT」は設定していません。これにより、前回の記事でご紹介したOracle Database 11gの「DBMS_STATS.AUTO_SAMPLE_SIZE」が使用されることになり、統計情報の収集時間の高速化が行われますね。, 最後に、念のため各表のオプティマイザ統計情報が収集されたのかを確認してみると、全ての表で統計情報がセットされていますし、それらが直近で収集されたものであることが「LAST_ANALYZED」列から判断することができます。, ■ 3.