More Related Content
PDF
GoldenGateテクニカルセミナー4「テクニカルコンサルタントが語るOracle GoldenGate現場で使える極意」(2016/5/11) PPTX
Oracle Advanced Security Transparent Data Encryptionのご紹介 PDF
Oracle GoldenGateでの資料採取(トラブル時に採取すべき資料) PDF
【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック PDF
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング PDF
オンプレミスからクラウドへ:Oracle Databaseの移行ベストプラクティスを解説 (Oracle Cloudウェビナーシリーズ: 2021年2月18日) PDF
Zero Data Loss Recovery Applianceによるデータベース保護のアーキテクチャ PDF
Oracle GoldenGate Cloud Serviceユーザーズガイド What's hot
PDF
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0 PPTX
Oracle Data Guard basics and how to create manually 18c plus PPTX
Oracle Database Vaultのご紹介 PDF
PDF
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... PPTX
[Oracle DBA & Developer Day 2014] しばちょう先生による特別講義! RMANの運用と高速化チューニング PDF
Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年7月版] PPTX
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#3 PDF
Oracle運用Tips大放出! ~ RAC環境のRMANのパラレル化を極める 編 ~ @2016-02-23 JPOUG PDF
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa... PDF
PPTX
Oracle Data Masking and Subsettingのご紹介 PDF
Oracle Database Applianceのご紹介(詳細) PDF
Oracle GoldenGate Veridata 12cR2 セットアップガイド PDF
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11) PDF
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada... PDF
Oracle GoldenGate Veridata概要 PDF
Oracle Database Appliance 12.1.2.3.0 アップデート及びパッチ管理について PDF
Oracle Database / Exadata Cloud 技術情報(Oracle Cloudウェビナーシリーズ: 2020年7月9日) PPTX
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料) Similar to Oracleのトランケートについて知っておくべきこと
PDF
Sql server data store data access internals PDF
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門 PPTX
Apuri she ji_gaido_teburushe_ji__v1.0 PDF
PDF
20151120_ビッグデータ/クラウドにデータ連携自由自在 “オンプレミス ↔ クラウド ↔ クラウド” by 株式会社インサイトテクノロジー 森田俊哉 PDF
各スペシャリストがお届け!データベース最新情報セミナー -PostgreSQL10- PPTX
Apuri she ji_gaido_d_bmentenansushe_ji__v1.0 PDF
C13 SQL Server2012知られざるTips集 by 平山理 PDF
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita PDF
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats... PPTX
Apuri she ji_gaido_detaxue_chu_she_ji__v1.2 PPTX
Sql server sql database 最新機能紹介 PDF
[db tech showcase Tokyo 2017] B14: 4年連続No.1リーダー評価のストレージでDBクローンするとどんな感じ?瞬時のクロー... PDF
Introduction of Oracle Database Architecture PDF
PDF
[Oracle Code Tokyo 2017] Live Challenge!! SQLパフォーマンスの高速化の限界を目指せ! PPTX
Google fusion tables api v1.0 tips rev2 PDF
45分で理解する SQL Serverでできることできないこと Oracleのトランケートについて知っておくべきこと
- 1.
- 2.
- 3.
アジェンダ
1. トランケートとは
2. 知っておくべきこと
①共有カーソルが無効化され、ハードパースが走る
② テーブルレベルのロックがかかる
③ ミニ・チェックポイントが走る
④ REUSE STORAGEを付けると遅くなることがある
⑤ グローバル索引のメンテナンスが必要
12c新機能について ~非同期グローバル索引メンテナンスとDDL遅延カーソル無効化
3. まとめ
3
NEW
- 4.
1.トランケートとは
• テーブル(パーティション)内のレコードを削除するDDL(=ロールバックはできない)
例) TRUNCATETABLE scott.emp
• HWM(ハイウォーターマーク)を下げることにより、テーブル内のレコードを削除するため、DELETEよ
り一般的に高速であり、ログ量も小さい
• REUSE STORAGEオプションを付けると確保済みエクステントを保持する
例) TRUNCATE TABLE scott.emp REUSE STORAGE
※デフォルトはdrop storageのため、エクステントは開放される
• パーティションレベルのトランケートはREUSE STORAGEオプションのほか、索引のリビルド・パラレル等
のオプションが指定可能
例) ALTER TABLE scott.emp TRUNCATE PARTITION part01 (...オプション)
※12cから複数のパーティションを指定可能
4
- 5.
- 6.
- 7.
②テーブルレベルのロックがかかる
• 特定のパーティションのトランケートでも、テーブルレベルで’library cachelock’(排他モード)を獲得
する ※おそらく共有カーソルを無効化するため
• ハードパースが必要なSQLは、 ’library cache lock’を共有モードで獲得する必要があるため、待
ちが発生する
• 異なるパーティションのトランケート処理を並列実行したとしても、上記理由から処理はシリアライズさ
れてしまう
7
テーブル
1 2 n・・・
パーティション
①トランケート
(パーティション1)
SQL1
SQL2
SQLn
ライブラリ
キャッシュ
×
×
×
・・・
③次回実行時の
ハードパース時に
ロック待ちによる
待機が発生
参照
②テーブルレベルで
library cache lock
(排他)を獲得
④トランケート
(パーティション2)
はロック待ちのため
シリアライズされる
- 8.
- 9.
④REUSE STORAGEを付けると遅くなることがある
• REUSESTORAGEはエクステントの開放をしないが、空ブロックであるというマークをする必要がある
ため、エクステント数(ブロック数)に応じてトランケート時間が延びる
• INSERT性能とのトレードオフも要考慮だが、REUSE STORAGEなしの方が速いことがある
※REUSE STORAGEの性能について を参照
9
1 2 n・・・
エクステント1
エクステント2
エクステントn
・・・
HWM
ヘッダ
ストレージ
ヘッダ
エクステント1
エクステント2
エクステントn
・・・
ヘッダ
HWM HWM
REUSE STORAGEありREUSE STORAGEなし
(デフォルト)
①トランケート
(パーティション1)
エクステントを開放し、
更新はセグメント・ヘッダ部のみ
エクステントを再利用するため
全てのエクステントのヘッダ部に
アクセスし「空き」状態に更新する
- 10.
- 11.
【参考】 REUSE STORAGEのエクステントの開放処理
11
SegmentDump: segment dba = 15 : 0x04d24263
Segment Type - Pagetable Segment
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 181 #blocks: 5792
last map 0x00000000 #maps: 0 offset: 5452
Highwater:: 0x04d24264 ext#: 0 blk#: 4 ext size: 32
・・・
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x04d24260 Data dba: 0x04d24264
Extent 1 : L1 dba: 0x04c0a780 Data dba: 0x04c0a781
Extent 2 : L1 dba: 0x04c0a780 Data dba: 0x04c0a7a0
・・・
Extent 178 : L1 dba: 0x04dc0320 Data dba: 0x04dc0380
Extent 179 : L1 dba: 0x04dc0320 Data dba: 0x04dc03a0
Extent 180 : L1 dba: 0x04dc0320 Data dba: 0x04dc03c0
--------------------------------------------------------
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 1 parent dba: 0x04d24262 poffset: 0
unformatted: 12 total: 16 first useful block: 4
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 4
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Dealloc scn: 718553152.0
Flag: 0x00000021 (OBJD/-/-/-/-/HWM)
Inc #: 0 Objd: 3517752
HWM Flag: HWM Set
Highwater:: 0x04d24264 ext#: 0 blk#: 4 ext size: 32
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x04d24260 Length: 16 Offset: 0
0:Metadata 1:Metadata 2:Metadata 3:Metadata
4:unformatted 5:unformatted 6:unformatted 7:unformatted
8:unformatted 9:unformatted 10:unformatted 11:unformatted
12:unformatted 13:unformatted 14:unformatted 15:unformatted
・・・
Truncate REUSE STORAGEはこれらを
全てのエクステントに対して更新する必要がある
◆セグメントダンプの取得方法
select segment_name, partition_name,extents,bytes,
tablespace_name, relative_fno, header_block from dba_segments
where owner=‘スキーマ名’ and segment_name=‘表名’ and
partition_name=‘パーティション名' order by partition_name;
alter session set tracefile_identifier=‘ログファイル識別名';
exec dbms_space_admin.segment_dump('表領域名',<relative_fno
>,<header_block>);
oradebug setmypid
oradebug tracefile_name
- 12.
⑤グローバル索引のメンテナンスが必要
• パーティションのトランケートでグローバル索引がアクセス不可(unusable)となる
• updateglobal indexesオプションでグローバル索引の自動更新が可能
例) ALTER TABLE scott.emp TRUNCATE PARTITION part01
UPDATE GLOBAL INDEXES PARALLEL 4
• 内部的にフルスキャンが走る(参考1)ため、テーブル全体の件数に応じて時間がかかる
• このフルスキャンのパラレル度はparallel句で指定可能
12
テーブル
1 2 n・・・
パーティション
①トランケート
(パーティション1)
テーブル
1 2 n・・・
パーティション
①トランケート
(パーティション1)
・・・
ローカル索引 グローバル索引
関連するローカル索引のみ
トランケートされる
グローバル索引の自動更新で
テーブルフルスキャンが走る
グローバル索引の
メンテによるフル
テーブルスキャン
参考1)Partition Truncate or Drop Taking a Long Time With SQL 'insert /*+
RELATIONAL . . . delete global indexes' (ドキュ メントID 2177233.1)
参考2)Tips for drop partition operation (ドキュメントID 1489462.1)
UPDATE GLOBAL
INDEXESで
トランケートすればアクセ
ス可
アクセス可
- 13.
- 14.
仕組み(想像)
indexobj# tabpartobj#
12345 67890
・・・
14
テーブル
12 n・・・
パーティション
グローバル索引
グローバル索引はメンテされず、メタデータのみ更新される
クエリはメタデータの情報を利用し正しい結果を返す
③クエリ発行。ブランチ経
由でリーフに到達。リーフ
を辿って検索範囲の
ROWIDを取得
①トランケート
(パーティション1)
④各ROWIDからorphandを除去
(TBL$OR$IDX$PART$NUM関
数によるフィルタ)
②トランケート対象パーティションと
関連する索引の情報が記録され
る(グローバル索引は変更なし)
⑤フィルタ済みROWID
をもとにパーティションにア
クセスし行を取得
sys.index_orphand_entry$
• truncate partitionした後のメタデータの更新とは、 グローバル索引のオブジェクトIDと、トランケート
したセグメントのオブジェクトIDの関連を保持すること
• ROWID (18バイト)の先頭6バイトがオブジェクトIDを示す。グローバル索引のリーフブロックに格納さ
れるROWIDから、それがどのパーティション(セグメント)に属しているかわかる
• 上記の情報を利用し、TBL$OR$IDX$PART$NUM関数に表の名前とROWIDを与え、ROWID
がorphanedなレコードをフィルタする(orphandでなければ1を返す)
トランケートされた
パーティションの
OBJECT_ID
関連する索引の
OBJECT_ID
SQL
⑥自動スケジューラジョブ
等で非同期にorphand
エントリが除去される
12c update
- 15.
【12c】遅延カーソル無効化(DDL deferred invalidation)
•12cR2~ではDDLに対して即時に共有カーソルの無効化をせず、可能なものは無効化を回避し、
避けられないものはローリング無効化をすることができるようになった
例)alter table xxx truncate partition yyy update global indexes deferred invalidation
15
12c update
◆検証内容
• レンジパーティション+ローカル/グローバル索引のsales表に対しSQLを実行(フルスキャン・索引レンジスキャン)
• パーティショントランケートをdeferred invalidationオプションあり・なしで確認(update global indexesあり)
• v$sqlのinvalidation(無効化された回数)、last_load_time(前回ハードパースの時刻)に着目
CREATE TABLE scott.sales
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id)
( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('20060401','YYYYMMDD'))
, PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('20060701','YYYYMMDD'))
, PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('20061001','YYYYMMDD'))
, PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('20061201','YYYYMMDD'))
);
insert into scott.sales values(1,1,to_date('20060101','YYYYMMDD'),'1',1,1,1);
insert into scott.sales values(2,1,to_date('20060401','YYYYMMDD'),'1',1,1,1);
insert into scott.sales values(3,1,to_date('20060701','YYYYMMDD'),'1',1,1,1);
insert into scott.sales values(4,1,to_date('20061001','YYYYMMDD'),'1',1,1,1);
commit;
create index scott.amount_sold_ix on scott.sales(amount_sold);
create index scott.prod_id_ix on scott.sales(prod_id) local;
SQL> select /* trunctest01 */ * from scott.sales;
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 328 | 25256 | 2
| 1 | PARTITION RANGE ALL | | 328 | 25256 | 2
| 2 | TABLE ACCESS STORAGE FULL| SALES | 328 | 25256 | 2
--------------------------------------------------------------------
SQL> select /* trunctest01 */ * from scott.sales where prod_id>0;
--------------------------------------------------------------------
| Id | Operation | Name | Ro
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | PARTITION RANGE ALL | |
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| SALES |
|* 3 | INDEX RANGE SCAN | PROD_ID_IX |
--------------------------------------------------------------------
SQL> select /* trunctest01 */ * from scott.sales where amount_sold>0
--------------------------------------------------------------------
| Id | Operation | Name
--------------------------------------------------------------------
| 0 | SELECT STATEMENT |
| 1 | TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| SALES
|* 2 | INDEX RANGE SCAN | AMOUNT_SOLD_IX
--------------------------------------------------------------------
ローカル索引
グローバル索引
- 16.
【12c】遅延カーソル無効化(DDL deferred invalidation)
•検証したところ、deferred invalidation付きのパーティショントランケートでは、フルスキャンおよび
ローカル索引のカーソル無効化を回避できることを確認
• グローバル索引を使用している共有カーソルはdeferred invalidationでも従来通りの挙動となった
16
12c update
パターン 操作 deferred invalidationなし deferred invalidationあり
invalidation last_load_time invalidation last_load_time
Full scan select * from sales 0 19:02:34 0 19:06:20
alter table … truncate partition 1 19:02:34 0 19:06:20
select * from sales 1 19:04:43 0 19:06:20
Index range
scan
(local)
select * from sales where prod_id>0 0 19:02:42 0 19:06:28
alter table … truncate partition 1 19:02:42 0 19:06:28
select * from sales where prod_id>0 1 19:04:50 0 19:06:28
Index range
scan
(global)
select * from sales where amount_sold>0 0 19:02:36 0 19:06:26
alter table … truncate partition 1 19:02:36 1 19:06:26
select * from sales where amount_sold>0 1 19:04:47 1 19:07:38ハード
パース
ハード
パース
カーソル
無効化
カーソル
無効化 ハード
パース
カーソル
無効化
ハード
パース
カーソル
無効化
- 17.
3.まとめ
• 運用中、トランケートは安易に実行しないこと。やるならオン中は避けること
• パーティションが異なっていても待機が発生することを肝に銘じること
•更新が多いテーブルのトランケートは時間がかかることを考慮すること
• REUSE STORAGEは速いと思い込まないこと。サイズに応じて時間がかかる
• グローバル索引は極力作らないこと(使うならメンテ方法も考えること)
• スケーラブルな処理方式にするためには、なるべくまとめてトランケートすること
• 12c新機能は押さえておくこと
17
テーブル
1 2 n・・・
パーティション
①トランケート
(パーティション)と
INSERTをn多重で実行
テーブル
1 2 n・・・
パーティション
①トランケート
(テーブル)
②INSERT
(n多重)
ハードパースが多発し
SQLが待機する。
トランケート処理が
シリアライズ化されてしまう
まとめてトランケートする
ことでスケールする処理方式に
多重化のメリットを享受
できないAP処理方式
- 18.