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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database 11g

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

Q&A

2回答

2785閲覧

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

Goripon

総合スコア11

Oracle Database 11g

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

0グッド

0クリップ

投稿2017/11/20 22:19

開発者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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

ヒープダンプの取得

SQL

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

トレースファイルの場所

SQL

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

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

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

チャンクの数を数える

SQL

1select count(*) from x$ksmsp;

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

ASHから影響確認

SQL

1select 2 substr(t2.sql_text,1,100) toplevelsqltext, 3 t.SQL_FULLTEXT sqltext, 4 h.* 5from 6 v$sql t, 7 v$sql t2, 8 v$active_session_history h 9where 10 t.sql_id = h.sql_id 11 and h.top_level_sql_id = t2.sql_id 12 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') 13 and h.in_hard_parse = 'Y' 14order by 15 sample_time 16;

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

投稿2017/11/21 03:41

ka_ei

総合スコア207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

投稿2017/11/20 22:50

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問