« VirtualBox de RAC (Oracle11g R1編)#2 | トップページ | VirtualBox de Oracle11g R2 RAC #1 »

2010年11月17日 (水)

多すぎるのはいかがな物かと。

少々間が空いてしまいましたが、久々にvirtualな世界の話じゃないネタ。

バッファキャッシュや共有プールに何も乗っかってない時と乗った後って、パーティションがどんだけあるかっていうことが、再帰コールとかconsistent getsとかphysical readsとかにも影響あるよね〜という確認。


どんなこと試したかっていうと…、
非パーティション表、50パーティション、100パーティション、500パーティション、1000パーティション、5000パーティション、10000パーティションの各パーティション表に対して、INSERT文を実行した場合どれだけ再帰コールなどが行われるのか確かめてみた。

前提
・初回のINSERT文実行前に共有プール、バッファキャッシュをクリアする。
・INSERTを3回実行する。
・deferred_segment_creation初期化パラメータは一時的にfalseにしておく。

まずは結果からどうぞ。consistent getsやphysical readsは再帰コールと同じ傾向があった。予想通り。

6_2


1回目だけ前述の再帰コール等が高くなる。これまた予想通り。まあこんなもんでしょうね。という確認でした。以下、10000パーティションで試した結果。

9


以下、ついでにいくつか確認した事のログ :)

SYS> show parameter deferred

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE


SYS> alter system set deferred_segment_creation=false scope=memory;

システムが変更されました。

SYS> show parameter deferred

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean FALSE

SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SYS>


SCOTT> desc test        
名前 NULL? 型
--------------------------- -------- ---------------------------
COL1 NOT NULL CHAR(4)
COL2 NOT NULL CHAR(8)
COL3 NOT NULL CHAR(10)
COL4 NOT NULL VARCHAR2(20)
COL5 NOT NULL CHAR(7)


SCOTT> select table_name,count(*) "num of partitions" from user_tab_partitions where table_name='TEST' group by table_name;

TABLE_NAME num of partitions
------------------------------ -----------------
TEST 10000

SCOTT> set timi on
SCOTT> alter system flush buffer_cache;

システムが変更されました。

経過: 00:00:00.04
SCOTT> alter system flush shared_pool;

システムが変更されました。

経過: 00:00:00.13
SCOTT> set autot trace exp stat
SCOTT> insert into test values('0001','12345678','0000123456','00001234560123456789','000001');

1行が作成されました。

経過: 00:00:01.02

実行計画
----------------------------------------------------------

-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 1 (0)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | TEST | | | |
-------------------------------------------------------------------------


統計
----------------------------------------------------------
242080 recursive calls
7 db block gets
40908 consistent gets
648 physical reads
3000 redo size
1180 bytes sent via SQL*Net to client
1331 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
52 sorts (memory)
0 sorts (disk)
1 rows processed

SCOTT> insert into test values('0009','12345678','0000123456','00001234560123456789','000001');

1行が作成されました。

経過: 00:00:00.01

実行計画
----------------------------------------------------------

-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 1 (0)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | TEST | | | |
-------------------------------------------------------------------------


統計
----------------------------------------------------------
32 recursive calls
39 db block gets
4 consistent gets
7 physical reads
2820 redo size
1179 bytes sent via SQL*Net to client
1331 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed

SCOTT> insert into test values('0010','12345678','0000123456','00001234560123456789','000001');

1行が作成されました。

経過: 00:00:00.02

実行計画
----------------------------------------------------------

-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 1 (0)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | TEST | | | |
-------------------------------------------------------------------------


統計
----------------------------------------------------------
1 recursive calls
39 db block gets
2 consistent gets
6 physical reads
2820 redo size
1180 bytes sent via SQL*Net to client
1331 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed


インサート後にupdateをしてみたが、shared_poolクリア後のようなrecursible callsの多さはない。

SCOTT> update test set code5='0000000' where code1='0010' and code2='0000123456';
<

0行が更新されました。

経過: 00:00:00.02

実行計画
----------------------------------------------------------
Plan hash value: 1398041643

-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | 25 | 0 (0)| 00:00:01 |
| 1 | UPDATE | TEST | | | | |
|* 2 | INDEX RANGE SCAN| TEST_PK | 1 | 25 | 0 (0)| 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("CODE1"='0010' AND "CODE2"='0000123456')


統計
----------------------------------------------------------
124 recursive calls
0 db block gets
18 consistent gets
3 physical reads
0 redo size
1180 bytes sent via SQL*Net to client
1326 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
0 rows processed

同じことをバッファキャッシュ、共有プールクリア後にやってみると…やはり、同程度のrecursible callsの回数になる。

SCOTT> alter system flush buffer_cache;

システムが変更されました。

経過: 00:00:00.06
SCOTT> alter system flush shared_pool;

システムが変更されました。

経過: 00:00:00.13
SCOTT> update test set code5='0000000' where code1='0010' and code2='0000123456';

0行が更新されました。

経過: 00:00:00.98

実行計画
----------------------------------------------------------
Plan hash value: 1398041643

-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | 25 | 0 (0)| 00:00:01 |
| 1 | UPDATE | TEST | | | | |
|* 2 | INDEX RANGE SCAN| TEST_PK | 1 | 25 | 0 (0)| 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("CODE1"='0010' AND "CODE2"='0000123456')


統計
----------------------------------------------------------
242492 recursive calls
0 db block gets
40980 consistent gets
650 physical reads
0 redo size
1180 bytes sent via SQL*Net to client
1326 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
41 sorts (memory)
0 sorts (disk)
0 rows processed

ようするにディクショナリキャッシュに該当オブジェクトのディクショナリ情報が乗ったということなんだろうねぇ。
insert文を実行してみるとrecursible callsは多少あるもののそれほど多いくはない。おそらくハードパースの影響だけなんだろう。

SCOTT> insert into test values('0011','12345678','0000123456','00001234560123456789','000001');

1行が作成されました。

経過: 00:00:00.08

実行計画
----------------------------------------------------------

-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 1 (0)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | TEST | | | |
-------------------------------------------------------------------------


統計
----------------------------------------------------------
32 recursive calls
39 db block gets
4 consistent gets
7 physical reads
2884 redo size
1180 bytes sent via SQL*Net to client
1331 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed

|

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/106341/50051132

この記事へのトラックバック一覧です: 多すぎるのはいかがな物かと。:

コメント

コメントを書く