Skip to main content
特濃JPOUG
Oracle Database 12c Pluggable Database
でSTATSPACKつかったらどうなるんだ
~ V$SYSSTATには要注意 ~
Japan Oracle User Group
山下 正
Contents
• JPOUG
• 今日話すこと
• 検証説明 / デモ
• まとめ

2
JPOUG
Japan Oracle User Group (http://www.jpoug.org/)
活動事例:
2011年6月
2012年4月
2012年7月
2012年10月
2013年12月
2013年5月
2013年7月
2013年9月
2013年11月
2013年12月

JPOUG活動開始
Oracle OpenWorld Unconference presented by JPOUG 開催
JPOUG> SET EVENTS 20120721
Unconference at db tech showcase 2012
JPOUG Advent Calendar 2013
db tech showcase 2013 Osaka
Tech Talk Night スタート
JAWS FESTA Kansai 2013
db tech showcase 2013 Tokyo
JPOUG Advent Calendar 2013 (http://www.zusaar.com/event/1687004)
3
今日話すこと
• Oracle Database 12c の Pluggable Database 環境で STATSPACK を動
かす。
• STATSPACKの結果を”素”のまま眺めるのはつらいので”ビジュアル
系”にしてみる。
• “???”を発見。
• “???”をもうちょっと深堀する。
• 無理やりまとめてみる。

4
検証環境
• Oracle Database 12c ( 12.1.0 ) Enterprise Edition on Oracle Linux 6.4
64bit
• Pluggable Database (Oracle Multitenant option)
• STATSPACK
• Oracle Application Express 4.2

5
検証環境
Oracle Database 12c Container Database

CDB
APEX

PDB$SEED

APEX

STATS
PACK

PDB
(PDBORCL)

APEX

STATS
PACK

PDB
(PDBORCL2)

CDB$ROOT

PDB
(PDBORCL3)

STATS
PACK

6
検証環境
Oracle Database 12c Container Database

CON_ID=0
APEX

CON_ID=2

APEX

STATS
PACK

CON_ID=3
(PDBORCL)

APEX

STATS
PACK

CON_ID=4
(PDBORCL2)

CON_ID=1

CON_ID=5
(PDBORCL3)

STATS
PACK

7
検証環境
CDB$ROOT@ORCL SQL> select CON_ID,DBID,NAME,OPEN_MODE,OPEN_TIME from v$containers;
CON_ID
---------1
2
3
4
5

DBID
---------1350188225
4064979437
2269547790
1200336578
1153988180

NAME
---------CDB$ROOT
PDB$SEED
PDBORCL
PDBORCL2
PDBORCL3

OPEN_MODE
---------READ WRITE
READ ONLY
READ WRITE
READ WRITE
READ WRITE

OPEN_TIME
-----------------------------13-11-07 11:59:14.685
13-11-07 11:59:14.691
13-11-10 17:54:27.347
13-11-10 17:54:27.344
13-11-10 17:54:27.344

CDB$ROOT@ORCL SQL>
CDB$ROOT@ORCL SQL> show user
ユーザーは"SYS"です。
CDB$ROOT@ORCL SQL> select count(*) from gv$sessions_count;
COUNT(*)
---------254

8
検証環境

STATSPACK 12.1
11g との違いは??
sprepins.sql

Rem
Rem
Rem

MODIFIED
shsong

(MM/DD/YY)
06/29/11 - shsong 06/28/11 - Bug 12702106: display
v$IOSTAT_FUNCTION_DETAIL

… といっても、もともと11gから存在するビューの情報が出るようになっただけ。
他は
spcreate.sql
spcusr.sql
spctab.sql
9
検証環境

STATSPACK 12.1
----------------------------------------------------------------------Oracle12g Server
Release 12.1
Production
------------------------------------------------------------------------Copyright (c) 1993, 2012, Oracle and/or its affiliates. All rights reserved.
Author: Connie Dialeris Green
Contributors: Cecilia Gervasio, Graham Wood, Russell Green, Patrick Tearle,
Harald Eri, Stefan Pommerenk, Vladimir Barriere, Kathryn Chou
Please refer to the Oracle11g server README file in the rdbms doc directory,
for copyright, disclosure, restrictions, warrant, trademark, disclaimer,
and licensing information. The README file is README_RDBMS.HTM.
Oracle Corporation, 500 Oracle Parkway, Redwood City, CA 94065.
-------------------------------------------------------------------------

10
検証環境
Oracle Application Express 4.2
「Oracle Application Express(Oracle APEX)は、Oracleデー
タベース用の宣言型高速Webアプリケーション開発ツールです。
完全にサポートされた無償のオプションとして、Oracle
Databaseのすべてのエディションで使用できます。」
http://www.oracle.com/technetwork/jp/developertools/apex/overview/index.html
11
検証
PDBORCL2上で3パターンの処理を実行し、それ
ぞれのデータベース上で確認できる統計値の現れ
方を確認する。

…画面

12
検証
画面サンプル(TopN Wait Event相当)

13
検証
画面サンプル(SQL ordered by XXX相当)

14
検証 waitevent

PDBORCL2で処理した影響を
受けて、PDBORCLで待機イベ
ントのWAIT時間が上昇

PDBORCL

PDBORCL2

CDB$ROOT

15
検証 waitevent

PDBORCL2で処理した影響を
受けて、PDBORCLで待機イベ
ントのWAIT時間が上昇

PDBORCL

PDBORCL2

CDB$ROOT

16
中間まとめ
• PDBで処理した結果はそれぞれのSTATSPACKに反映されてい
る。
• コンテナ・データベースはSGAも共有リソースとしているため、
SGA関連の待機イベントは他のPDBに影響する可能性があるの
で注意。 ORA-04031 とか
• CDB$ROOTで確認できる統計値はすべてのPDBの統計値を包
含している。

17
もう一度APEXの画面確認
PDB(PDBORCL)

PDB(PDBORCL2)

PDBORCL2で実行し
PDBORCL2で実行し
た処理により
た処理により
execute count が上
execute count が上
昇しているケース。
昇しているケース。

PDBORCL2で実行した処理
により execute count が上
昇していないケース。

18
もう一度APEXの画面確認
• 処理を実行したPDB以外で “execute count” が上昇している
• “execute count”はインスタンス・ワイドでカウントされる?
………………そうではないケースもある。

• CDB$ROOTで見るといずれのケースでも “execute count”が
上昇している。
…… よくわからない……
19
“execute count”深堀
• Oracle Database 12c で追加された新しいビューをみる。
http://docs.oracle.com/cd/E49329_01/server.121/b71292/release_cha
nges.htm#CJAJEECB
• 今回は「 V$CON_SYSSTAT 」ビューをチェック

20
V$SYSSTATとV$CON_SYSSTAT
CDB$ROOT@ORCL SQL> desc v$sysstat
名前
NULL?
----------------------------- -------STATISTIC#
NAME
CLASS
VALUE
STAT_ID
CON_ID

型
--------------NUMBER
VARCHAR2(64)
NUMBER
NUMBER
NUMBER
NUMBER

CDB$ROOT@ORCL SQL> desc v$con_sysstat
名前
NULL?
----------------------------- -------STATISTIC#
NAME
CLASS
VALUE
STAT_ID
CON_ID

型
--------------NUMBER
VARCHAR2(64)
NUMBER
NUMBER
NUMBER
NUMBER

おなじ
21
CON_IDって…
<V$SYSSTAT から抜粋 >
CON_ID NUMBER データが関係するコンテナのID。
可能な値は次のとおり。
0: この値は、CDB全体に関連するデータを含む行に使用される。この値は、非CDB内の行にも使用される
1: この値は、ルートのみに関連するデータを含む行に使用される
n: nは、データを含む行に適用されるコンテナID

Oracle Databaseリファレンス 12c リリース1 (12.1) B71292-01
http://docs.oracle.com/cd/E49329_01/server.121/b71292/refrn30272.htm#i1420473
<V$CON_SYSSTAT から抜粋 >
CON_ID NUMBER CDB以外から問合せが行われた場合は、そのインスタンスの統計情報が返され、
CON_ID値が0に設定されます。
CDBのルートから問合せが行われた場合は、各コンテナの統計情報が返され、CON_ID値はその統計情報
に対応するコンテナを示します。
PDBから問合せが行われた場合は、そのPDBの統計情報が返され、CON_ID値がそのPDBのコンテナIDに
設定されます。

Oracle Databaseリファレンス 12c リリース1 (12.1) B71292-01
http://docs.oracle.com/cd/E49329_01/server.121/b71292/refrn30716.htm#I1030716

22
V$SYSSTATとV$CON_SYSSTAT
●各データベース内でV$SYSSTATを参照した時のCON_ID
データベース

CON_ID

参照時のユーザがSYSの
場合のV$SYSSTATの
CON_ID

参照時のユーザがPERFSTAT
の場合のV$SYSSTATの
CON_ID

CDB$ROOT

1

0

0

PDB(PDBORCL)

3

3

3

-

CDB$ROOTで確認できるのは、コンテナ・データベース全体の統計値

-

各PDBではPDB内の統計情報が参照可能

-

CDB$ROOTでは、自分(CON_ID=1)だけの統計値を見ることができない

23
V$SYSSTATとV$CON_SYSSTAT
●さらに、各データベース内でV$CON_SYSSTATを参照した時のCON_ID
データベース

V$SYSSTATのCON_ID

V$CON_SYSSTATのCON_ID

CON_ID

SYS

PERFSTAT

SYS

PERFSTAT

CDB$ROOT

1

0

0

1,2,3,4,5

1

PDB(PDBORCL)

3

3

3

3

3

-

V$CON_SYSSTAT をつかうと CDB$ROOTでコンテナ・データベース内の個々の統計値をすべて参照可能

-

V$CON_SYSSTATを使っても各PDBではPDB内の統計情報だけが参照可能
24
V$SYSSTATとV$CON_SYSSTAT
●さらに、各データベース内でV$CON_SYSSTATを参照した時のCON_ID
データベース

V$SYSSTATのCON_ID

V$CON_SYSSTATのCON_ID

CON_ID

SYS

PERFSTAT

SYS

PERFSTAT

CDB$ROOT

1

0

0

1,2,3,4,5

1

PDB(PDBORCL)

3

3

3

3

3

PDB(PDBORCL2)

4

4

4

4

4

-

V$CON_SYSSTAT をつかうと CDB$ROOTでコンテナ・データベース内の個々の統計値をすべて参照可能

-

V$CON_SYSSTATを使っても各PDBではPDB内の統計情報だけが参照可能
25
V$CON_SYSSTATって…
CDB$ROOT@ORCL SQL> select * from v$con_sysstat where name = 'execute count'

STATISTIC# NAME

CLASS

VALUE

STAT_ID

CON_ID

---------- -------------------- ---------- ---------- ---------- ---------3890 execute count

64

16268331 2453370665

1

3891 execute count

64

14966176 2453370665

2

3892 execute count

64

14966689 2453370665

3

3893 execute count

64

14966659 2453370665

4

3894 execute count

64

14966176 2453370665

5
26
V$CON_SYSSTATって…
CDB$ROOT@ORCL SQL> select * from v$con_sysstat where name = 'execute count'
2 union all
3 select * from v$sysstat where name = 'execute count';
STATISTIC# NAME

CLASS

VALUE

STAT_ID

CON_ID

---------- -------------------- ---------- ---------- ---------- ---------3890 execute count

64

16268331 2453370665

1

3891 execute count

64

14966176 2453370665

2

3892 execute count

64

14966689 2453370665

3

3893 execute count

64

14966659 2453370665

4

3894 execute count

64

14966176 2453370665

5

778 execute count

64

16269327 2453370665

0

27
V$CON_SYSSTATって…
• V$CON_SYSSTAT の縦横を変換して差分計算する。
• ダミーの負荷(@1000_select.pdborcl.loop.sql)かけた結果は、、、、
…..画面

28
V$CON_SYSSTATって…
CDB$ROOT@ORCL SQL> select * from v$con_sysstat where name = 'execute count'
2 union all
3 select * from v$sysstat where name = 'execute count';
STATISTIC# NAME

CLASS

VALUE

STAT_ID

CON_ID

---------- -------------------- ---------- ---------- ---------- ---------3890 execute count

64

16268331 2453370665

1

3891 execute count

64

14966176 2453370665

2

3892 execute count

64

14966689 2453370665

3

3893 execute count

64

14966659 2453370665

4

3894 execute count

64

14966176 2453370665

5

778 execute count

64

16269327 2453370665

0

29
V$CON_SYSSTATって…
execute count

※イメージです

CDB$ROOT@ORCL SQL> select * from v$con_sysstat where name = 'execute count'
CON_ID=1,3,4はアクティ
2 union all

ビティーがあるPDB

3 select * from v$sysstat where name = 'execute count';
STATISTIC# NAME

CLASS

VALUE

CON_ID=2,5はアクティビ
ティーがないPDB
STAT_IDかつ、execute count の値が
CON_ID
同じ!?

---------- -------------------- ---------- ---------- ---------- ---------3890 execute count

64

16268331 2453370665

1

3891 execute count

64

14966176 2453370665

2

3892 execute count

64

14966689 2453370665

3

3893 execute count

64

14966659 2453370665

4

3894 execute count
CON_ID=0
CON_ID=1
778 execute count

CON_ID=2

64 CON_ID=3
14966176 2453370665
CON_ID=4
CON_ID=5

5

64

0

execute count

16269327 2453370665

30
V$CON_SYSSTATって…
※イメージです

CDB$ROOT@ORCL SQL> select * from v$con_sysstat where name = 'execute count'
2 union all
3

CON_ID=2(PDB$SEED)の値をベースライ
ンとして、その差分を合計すると、
select * from v$sysstat where name = 'execute count';
V$SYSSTATで検索した execute count
(CON_ID=0)の値と一致する。

STATISTIC# NAME

CLASS

VALUE

STAT_ID

CON_ID

---------- -------------------- ---------- ---------- ---------- ---------3890 execute count

64

16268331 2453370665

1

3891 execute count

64

14966176 2453370665

2

3892 execute count

64

14966689 2453370665

3

3893 execute count

64

14966659 2453370665

4

3894 execute count
CON_ID=0
CON_ID=1
execute count
778 execute count

CON_ID=2

execute count2

64 CON_ID=3
14966176 2453370665
CON_ID=4
CON_ID=5

5

64

0

execute count3

execute count4
execute count5
16269327 2453370665

31
V$CON_SYSSTATって…
“execute count” の値で確認

VIEW

CON_ID NAME

VALUE

VALUE –” CON_ID=2”のVALUE

V$CON_SYSSTAT

1 execute count

16527933

1312820

V$CON_SYSSTAT

2 execute count

15215113

0

V$CON_SYSSTAT

3 execute count

15215795

682

V$CON_SYSSTAT

4 execute count

15215581

468

V$CON_SYSSTAT

5 execute count

15215113

0
sum

V$SYSSTAT

0 execute count

16529083 + con_id=2のVALUE

1313970
16529083

32
V$CON_SYSSTATって…
“physical reads” の値で確認

VIEW

CON_ID NAME

VALUE

VALUE –” CON_ID=2”のVALUE

V$CON_SYSSTAT

1 physical reads

13045097

446076

V$CON_SYSSTAT

2 physical reads

12599021

0

V$CON_SYSSTAT

3 physical reads

12599273

252

V$CON_SYSSTAT

4 physical reads

12599155

134

V$CON_SYSSTAT

5 physical reads

12599021

0
sum

V$SYSSTAT

0 physical reads

13045483 + con_id=2のVALUE

446462
13045483

33
V$CON_SYSSTATって…
“consistent gets” の値で確認

VIEW

CON_ID NAME

VALUE

VALUE –” CON_ID=2”のVALUE

V$CON_SYSSTAT

1 consistent gets

98434084

4972139

V$CON_SYSSTAT

2 consistent gets

93461945

0

V$CON_SYSSTAT

3 consistent gets

93464277

2332

V$CON_SYSSTAT

4 consistent gets

93463505

1560

V$CON_SYSSTAT

5 consistent gets

93461945

0
sum

V$SYSSTAT

0 consistent gets

98437976 + con_id=2のVALUE

4976031
98437976

34
V$CON_SYSSTATって
• PDB$SEEDの値はコンテナ・データベース内の共通的な値のようだ。
• それぞれのPDBに重複してカウントされているように見える。
• この値を考慮して差分と合計すると、CON_ID=0の値と同じになる。
• 各PDBの差分の値を利用することで、PDB個別のアクティビティを把
握することができるのではないか。

35
V$CON_SYSSTATって
• もう一度 PDBORCL2(CON_ID:4)に負荷をかけると、、、
• 今度の負荷(1000_select.pdborcl.loop.sh)かけた結果は、、、、
…画面

36
補足
• 「ダミーの負荷(@1000_select.pdborcl.loop.sql)」
負荷をかけた環境でのみ “execute count”がカウントされる

• 「今度の負荷(1000_select.pdborcl.loop.sh)」
負荷をかけた環境以外でも “execute count”がカウントされる

• 上記より、同じ処理でも実行方法の違いにより、”execute count”の値が異なって
表示されることがある事象を確認。
• つまり、PDBのV$SYSSTATから得られる execute count の値は従来と同じような
(期待した通りの)値を示さない場合がある。
※ ここでは “期待した通り”とは、「あるPDBで実行したSQLの実行回数は、そのPDBのみの”execute
count”としてカウントされること」としています。
37
PDBのV$SYSSTATでは、、、
• 同一の処理にも拘わらず、SQLの実行方法によっては、CDB$ROOTで
確認するV$CON_SYSSTATの各PDBの統計値が異なってしまう。
• V$SYSSTATでインスタンス全体の統計値(CON_ID:0)が確認できれば、
STATSPACKを利用する分には問題ないだろうか。

38
CDB$ROOTならSTATSPACK使えるか?…
PERFSTATスキーマでCDB$ROOTのV$SQLを確認すると各PDBのSQLの
情報は確認できない。なぜなら、CDB$ROOTでは CON_ID=1しか見えな
いから。
…..画面
CDB$ROOT@ORCL SQL> show user
ユーザーは"PERFSTAT"です。
CDB$ROOT@ORCL SQL> show con_id
CON_ID
-----------------------------1
CDB$ROOT@ORCL SQL> show con_name
CON_NAME
-----------------------------CDB$ROOT

CDB$ROOT@ORCL SQL> select distinct con_id from v$sql;
CON_ID
---------1
CDB$ROOT@ORCL SQL> select distinct con_id from
v$sqlarea;
CON_ID
---------1
39
各ビューで確認できるCON_IDは、、、
●各DBとユーザで確認できるビュー別のCON_ID
データベース
ビュー/ユーザ
V$SYSSTAT
V$SQL
V$WAITSTAT
V$CON_SYSSTAT

CDB$ROOT

PDB(PDBORCL)

SYS

PERFSTAT

SYS

PERFSTAT

0

0

3

3

1,2,3,4,5

1

3

3

1

1

3

3

1,2,3,4,5

1

3

3

40
STATSPACKが使えるかといえば、、、
●各DBのPERFSTATスキーマでレポートに必要な情報が取得できているか????
データベース
ビュー/ユーザ
V$SYSSTAT
V$SQL
V$WAITSTAT
V$CON_SYSSTAT

CDB$ROOT

PDB(PDBORCL)

SYS

PERFSTAT

SYS

0

0
○

3

1,2,3,4,5
1
1,2,3,4,5

CDB$ROOTのPERFSTATでは、CON_ID=1
のデータしか確認することができない。
つまり、コンテナ・データベース全体の
統計値を扱うことができないため、
STATSPACKレポートとしてはデータがた
りない???

1
×
1
×
1
×

3
3
3

PERFSTAT
3
×
3
○
3
○

3
×

各PDBのPERFSTATで確認できるV$SYSSTAT/V$CON_SYSSTAT
の値は、SQLの実行方法によっては、別のPDBの統計値が
含まれてしまう場合があり、正確性に欠ける。
つまり、PDB個別の統計値を扱うことができないため、個別
のPDBを評価するためのSTATSPACKレポートとしては???
41
Pluggable Database の STATSPACKって…
いまのところよくわからないねぇ…

42
続報 2013/11/18更新
• 各PDBへの接続がない状態では、CDB$ROOTで検索するV$CON_SYSSTATのそれぞれの
CON_ID(2,3,4,5…)は同じ値になることを確認。(※ CON_ID=1でクエリーを実行するため、CON_ID=1の値は異なる)
• 各PDBのセッション別の統計値を合計した値と、V$CON_SYSSTAT の各CON_IDの統計値
からCON_ID=2の統計値を差し引いた値が同じ値になることを確認。
• つまり、V$CON_SYSSTATの値は、V$SESSTATの値から導出(sum(value))されていると考
えられる。
• V$SESSSTATは該当セッションが切断されると、当然検索できなくなるが、このタイミング
で、V$CON_SYSSTATの自身以外のCON_IDに切断されたセッション分の統計値が加算さ
れているように見える。
• 各PDBのV$CON_SYSSTATの値は、自身のPDBで検索できるV$SYSSTATの値と同じである
ため、上記の動作からV$SYSSTATにはほかのPDBの統計値が反映されていると考えら
れる。
• よって、各PDBのSTATSPACKには別のPDBの統計情報が反映されていると考えられるた
め、純粋に対象のPDBのみを分析する目的としては不向きではないだろうか。

43
続報 2013/11/18更新
CDB$ROOT@ORCL SQL> select 'v$sesstat' viewname ,a.name,sum(b.value),c.con_id
2
from v$statname a,v$sesstat b,v$session c
3 where a.statistic# = b.statistic#
4
and a.name ='execute count'
VIEWNAME
NAME
SUM(B.VALUE)
CON_ID
5
and b.sid = c.sid
------------- ------------------ ------------ ---------6
and c.con_id = 3
v$sesstat
execute count
722
3
v$con_sysstat execute count
52860484
1
7 group by a.name,c.con_id
v$con_sysstat execute count
50340943
2
8 union all
v$con_sysstat execute count
50341665
3
9 select 'v$con_sysstat' viewname, name,value,con_id
v$con_sysstat execute count
50340943
4
10
from v$con_sysstat
v$con_sysstat execute count
50340943
5
11 where name = 'execute count'
v$sysstat
execute count
52861206
0
12 union all
7行が選択されました。
13 select 'v$sysstat' viewname, name ,value,con_id
14
from v$sysstat
CDB$ROOT@ORCL SQL> /
15 where name = 'execute count'
16 /
VIEWNAME
NAME
SUM(B.VALUE)
CON_ID
------------v$con_sysstat
v$con_sysstat
v$con_sysstat
v$con_sysstat
v$con_sysstat
v$sysstat

------------------ ------------ ---------execute count
52862201
1
execute count
50341695
2
execute count
50341695
3
execute count
50341695
4
execute count
50341695
5
execute count
52862201
0

6行が選択されました。

50341665(CON_ID:3)
- 50340943(CON_ID:2)
---------------722

この間にCON_ID=3
のセッションを切断

CON_ID2~5まで全部同
じ値。よって、CON_ID=1
の値も、CON_ID=0の値
と同じ。
44
Any Question?

@tadayima_jp
Tadashi Yamashita
45
Thank you!

@tadayima_jp
Tadashi Yamashita
46