質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • Oracle Database 11g

    149questions

    Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Oracle共有プールの断片化解消のテスト方法

受付中

回答 2

投稿 2017/11/21 07:19

  • 評価
  • クリップ 0
  • VIEW 74

Goripon

score 3

開発者2年目の若輩者です。
テスト方法に関して、ご意見を頂きたく質問致します。

職場のDBサーバで共有プールの断片化が発生しているため、暫定的な処置として共有プールのフラッシュを行うことになりました。
夜間バッチの一部として、対処してほしいとのことです
そのため以下のようにして、断片化の解消をしようと思っています。

【hoge.bat】
@echo off
~省略~
@hoge.sql
~省略~
exit

【hoge.sql】
ALTER SYSTEM FLUSH SHARED_POOL;

そこでテストに関して質問なのですが、
① 何を目的としてテストを行えば良いか
② ①に関してのテスト実施方法はどうすれ良いか

ちなみに①に関しては以下を考えています。
(1)本当に共有プールの断片化が解消されているか
(2)他の夜間バッチに対する影響はないか
(3)キャッシュが削除されてしまうため、その後のアプリケーションからのアクセスにどの程度スピードの影響があるかです。
ただ、テスト実施方法がわからず困っています。

「①のここが足りていない」や「②の実施方法に関してはこうしたら良い」というご回答を頂きたいと思っています。
また、バッチやSQLに関しての厳しいご意見も承ります。

宜しくお願い致します。

【環境】
Windows Server
Oracle Database 11g

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

①の「何を目的としてテストを行えば良いか」については観点は問題ないと思います。
実施方法としては、ヒープダンプを取る、という方法があります。

ヒープダンプの取得

alter session set events 'immediate trace name heapdump level 2';

トレースファイルの場所

SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace';

最新の.trcファイルを開き、HEAP DUMPで検索してください。そこからダンプの内容が始まります。
エクステント(EXTENT 0~?)の下にチャンク(Chunk)がぶら下がっていて、その横にステータスが書いてあると思います。チャンクの数が共有プールFLUSH後であれば少なくなっているのが分かると思います。

もしくは、単純にチャンクの数を数えるという方法でもよいかと思います。FLUSH後に少なくなっているのが分かると思います。

チャンクの数を数える

select count(*) from x$ksmsp;

共有プールFLUSH後の影響はOrlofskyさんの回答の通り、ハードパースがどれぐらいかかるかというところを確認すればよいと思います。どの程度の影響が出るかは、ACTIVE_SESSION_HISTORY(通称ASH)のin_hard_parse列がYのセッションを確認すればよいです。サンプルSQLを提示します。

ASHから影響確認

select
  substr(t2.sql_text,1,100) toplevelsqltext,
  t.SQL_FULLTEXT sqltext,
  h.*
from
  v$sql t,
  v$sql t2,
  v$active_session_history h
where
    t.sql_id = h.sql_id
  and h.top_level_sql_id = t2.sql_id
  and h.sample_time  between to_date('2017/11/21 10:00:00','YYYY/MM/DD Hh24:MI:SS') AND to_date('2017/11/21 15:59:59','YYYY/MM/DD Hh24:MI:SS')
  and h.in_hard_parse = 'Y'
order by
  sample_time
;

時間は、h.sample_time列で絞った方がいいです。また、h.module列にjavaのバッチであればJDBC等識字別できる文字が出力されるので、それで絞るとなおよいと思います。
1行につき1秒かかっているとみることができるので、sql_text単位で結果行数が多ければ多いほど影響があると捉えることができます。

投稿 2017/11/21 12:41

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

可能であれば Oracleを一度shutdownしてstartupし直すのが手っ取り早いです。

SQLを実行すると、Oracleは今実行しようとするSQLが共有プールに同じSQLがあればそれを実行し、なければparse(コンパイル)して共有プールに保存し、実行します。

ALTER SYSTEM FLUSH SHARED_POOL;
を実行するとそれ以降実行されるSQLは共有プールに同じSQLがないのでparseし直さなければならないので遅くなります。どの程度の時間遅くなるかはSQLの多さなどによって違います。同じSQLが何度も実行するようなシステムなら遅くなる時間は短いです。

津島博士のパフォーマンス講座 第14回 メモリ・チューニングについて

投稿 2017/11/21 07:50

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

  • 解決済

    インデックスが効かない場合

    IN句とサブクエリを使うと、インデックスが効かず、フルスキャンされてしまいますが、これはmysqlが内部的にexistsに変換してしまうからです。その他にも内部処理によって、インデ

  • 受付中

    条件式の書き方

    SQLでの条件式の質問なのですが、以下のようなデータがある時に、 カラム1|カラム2    A             1    A             2    A    

  • 受付中

    PHPとPDOでの接続で同じカラム名の異なる値を取得したい

    PDOでmysqlに接続してまして、joinで4テーブルくらいくっつけた物をHTMLへ表示させたいのですが、カラム名が同じだと上書きされてしまって困っています。 dbのカラム名は

  • 解決済

    Oracleの外部結合について

    こちらのSQLで test_tb1のカラムa.idとnameで紐づくb.hogeのカラム がまとめて出力されるかと思います。 select a.id, b.hog

  • 解決済

    Oracle12cは、「iSQL*plus」は無くなってしまったのでしょうか?

    Oracle12cをインストールしました。 Oracle10gの場合は、iSQL*plusというものがあったようですが、12cは無くなってしまったのでしょうか? 下記の

  • 解決済

    update分の一部置換

    お世話になります。 データベースの、名前が入っている列(すべて2文字を想定) を一括で置き換えたいのですがなにがいけないのでしょうか。 個人情報テーブル NAME

  • 受付中

    PL/0'で配列を表現したい

    プログラムを作成してみたのですがうまく動作しませんでした。 どのようにすればよいのでしょうか? var i, a[10]; begin i := 4; while i >=

  • 解決済

    バッチファイルからSQLを実行し、TABLEのデータをアップデートしたい

    SQLをバッチファイルから実行して、指定のデータをアップデートしたいです。 SQLは作れていて、外部から指定したい部分は一旦リテラルで固定データとして単体としては動作が確認でき

同じタグがついた質問を見る

  • Oracle Database 11g

    149questions

    Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。