Load Data Build Indexes Commit
LOAD into
staging table ATTACH
SET INTEGRITY
SET INTEGRITY
Build Indexes
Constraints MQT maint
Constraints MQT maint
read only off line
off line available
available available
パーティション表 : ATTACH + SET INTEGRITY 従来の方法: LOAD + SET INTEGRITY
off line
read only
可用性の比較
SET INTEGRITYで実行されること
レンジのチェック
z 追加された行が指定したレンジの範囲にあるかチェックする
索引メンテナンス
z 追加されたパーティションの行のキーを索引に追加する
¾ 1UOWで実行されるためログスペースを考慮のこと
制約のチェック
z ユニーク制約、参照制約、検査制約の検査を行う
生成列のメンテナンス
z FORCE GENERATEDオプションを指定すると正しい値に更新 z する 生成列がパーティション・キーの一部の場合は、正しい値に生
成後、 レンジのチェックを行う
z 1UOWで更新する
©日本IBMシステムズ・エンジニアリング(株) Information Management部 77
SET INTEGRITYで実行されること(続き)
ID列のメンテナンス
z GENERATE IDENTITYオプションを指定すると採番をしなおす z ID列がパーティション・キーの一部の場合は、正しい値に生成
後、レンジのチェックを行う z 1UOWで更新する
MQTのメンテナンス
z パーティション表をベース表とし、Refresh Immediateのオプショ ン指定で作成されたMQTやステージング表がある場合、アタッ チされたパーティションの内容でこれらを更新する。
例外表の指定を推奨
z エラー発生(指定範囲外の行があった、etc)の場合、アタッチ 済パーティションはアクセス可能にならない
z SET INTEGRITY実行時に、例外表を指定(EXCEPTIONオプ ション)すると、エラーになった行が例外表に書き出され、アタッ チ済パーティションがアクセス可能となる
Set integrityの実行 レンジのチェック
create table test1 (c1 int not null primary key,c2 int) partition by range(c2) (starting 1 ending 100 every 25) DB20000I SQL コマンドが正常に終了しました。
insert into test1 values(1,1),(26,26),(51,51),(76,76) DB20000I SQL コマンドが正常に終了しました。
create table test1_p (c1 int not null,c2 int) DB20000I SQL コマンドが正常に終了しました。
insert into test1_p values(101,101),(1000,1000) DB20000I SQL コマンドが正常に終了しました。
alter table test1 attach partition starting (101) ending(125) from test1_p
SQL3601W ステートメントにより 1 つ以上の表が自動的に SET INTEGRITYペンディング状態になりました SQLSTATE=01586
set integrity for test1 immediate checked
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQLステートメントとして処理されま した。SQL処理中にそのコマンドが返されました。
SQL3603N SET INTEGRITY ステートメントによるデータ・チェック処理が、名前"SANTAV9.TEST1.RANGE_CONSTRAINT"の
制約またはユニーク索引に関係する保全性違反を見つけました。 SQLSTATE=23514
2レコード目(1000,1000)は、範囲外
©日本IBMシステムズ・エンジニアリング(株) Information Management部 79
Set integrityの実行 レンジのチェック(続き)
select substr(name,1,8),status,access_mode,const_checked from sysibm.systables where name like 'TEST%' 1 STATUS ACCESS_MODE CONST_CHECKED
--- --- --- ---TEST1 C F YYYYYYYNYYYYYYYYYYYYYYYYYYYYYYYY
1 レコードが選択されました。
select substr(DATAPARTITIONNAME,1,8) as dbname, smallint(DATAPARTITIONID) as partid, substr(TABNAME,1,8) as tabname, substr(STATUS ,1,2) as status, ACCESS_MODE from syscat.datapartitions where tabname like 'TEST%' DBNAME PARTID TABNAME STATUS MODE
-- -- ----PART1 1 TEST1 F PART2 2 TEST1 F PART3 3 TEST1 F PART4 4 TEST1 A N PART0 0 TEST1 F
アタッチしたパーティションへはアクセス不可
Set integrityの実行 レンジのチェック(続き)
set integrity for test1 immediate checked for exception in test1 use test1_ex
SQL3602W CHECK DATA処理で制約違反が見つかり、それらは例外表に移動されました。 SQLSTATE=01603 select substr(name,1,8),status,access_mode,const_checked from sysibm.systables where name like 'TEST%' 1 STATUS ACCESS_MODE CONST_CHECKED
--- --- --- ---TEST1 N F YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY TEST1_EX N F YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
2 レコードが選択されました。
select substr(DATAPARTITIONNAME,1,8) as dbname, smallint(DATAPARTITIONID) as partid, substr(TABNAME,1,8) as tabname, substr(STATUS ,1,2) as status, ACCESS_MODE from syscat.datapartitions where tabname like 'TEST%' DBNAME PARTID TABNAME STATUS MODE
-- -- ----PART1 1 TEST1 F PART2 2 TEST1 F PART3 3 TEST1 F PART0 0 TEST1_EX F PART0 0 TEST1 F PART4 4 TEST1 F
6 レコードが選択されました。
$ db2 "select * from test1_ex"
C1 C2
---1000 ---1000
1 レコードが選択されました。
例外表を指定してSET INTEGRITYを実行
©日本IBMシステムズ・エンジニアリング(株) Information Management部 81
Set integrityの実行 生成列の更新
create table test3 (c1 int not null primary key, c2 int not null , c3 int generated always as (c1 + c2)) in tbs1 partition by range(c3) (starting 1 ending 100 every 25)
DB20000I SQL コマンドが正常に終了しました。
insert into test3 (c1,c2) values(1,1),(26,1),(51,1),(76,1) DB20000I SQL コマンドが正常に終了しました。
create table test3_p (c1 int not null, c2 int not null, c3 int ) in tbs1 DB20000I SQL コマンドが正常に終了しました。
insert into test3_p (c1,c2,c3) values(101,1,0) DB20000I SQL コマンドが正常に終了しました。
alter table test3 attach partition starting(101) ending(125) from test3_p
SQL3601W ステートメントにより 1 つ以上の表が自動的に SET INTEGRITYペンディング状態になりました。
SQLSTATE=01586
パーティション表(test3)のC3列は、
(C1+C2)のため、本来102 が正しい
Set integrityの実行 生成列の更新(続き)
set integrity for test3 immediate checked
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQLステートメントとして処理されました。
SQL処理中に、そのコマンドが返されました。
SQL3603N SET INTEGRITY ステートメントによるデータ・チェック処理が、名前"SANTAV9.TEST3.RANGE_CONSTRAINT"
の制約またはユニーク索引に関係する保全性違反を見つけました。 SQLSTATE=23514
set integrity for test3 immediate checked force generated DB20000I SQL コマンドが正常に終了しました。
$ db2 "select * from test3"
C1 C2 C3
---1 ---1 2 26 1 27 51 1 52 76 1 77 101 1 102 5 レコードが選択されました。
正しい値に 生成されている
0 Î102
©日本IBMシステムズ・エンジニアリング(株) Information Management部 83
Set integrityの実行 生成列の更新(続き)
生成列がpartition keyで、生成後の値がレンジ範囲外の場合
create table test3 (c1 int not null primary key, c2 int not null , c3 int generated always as (c1 + c2)) in tbs1 partition by range(c3) (starting 1 ending 100 every 25)
insert into test3 (c1,c2) values(1,1),(26,1),(51,1),(76,1)
create table test3_p (c1 int not null, c2 int not null, c3 int ) in tbs1 insert into test3_p (c1,c2,c3) values(101,1000,115)
alter table test3 attach partition starting(101) ending(125) from test3_p
SQL3601W ステートメントにより 1 つ以上の表が自動的に SET INTEGRITYペンディング状態になりました。SQLSTATE=01586
set integrity for test3 immediate checked force generated
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQLステートメントとして処理されました。
SQL処理中に、そのコマンドが返されました。
SQL3603N SET INTEGRITY ステートメントによるデータ・チェック処理が、名前"SANTAV9.TEST3.RANGE_CONSTRAINT"
の制約またはユニーク索引に関係する保全性違反を見つけました。 SQLSTATE=23514
元の値はC3=115で101 –125 の範囲内だが、
(C1+C3)で更新すると1101となり範囲外に なる
Set integrityの実行 ID列の更新
create table test5
(c1 int not null primary key, c2 int not null ,
c3 int generated always as identity (start with 1,increment by 1)) partition by range(c2) (starting 1 ending 100 every 25)
DB20000I SQL コマンドが正常に終了しました。
insert into test5 (c1,c2) values(1,1),(26,26),(51,51),(76,76) DB20000I SQL コマンドが正常に終了しました。
create table test5_p
(c1 int not null, c2 int not null, c3 int not null) DB20000I SQL コマンドが正常に終了しました。
insert into test5_p (c1,c2,c3) values(101,101,1) DB20000I SQL コマンドが正常に終了しました。
alter table test5 attach partition starting(101) ending(125) from test5_p
SQL3601W ステートメントにより 1 つ以上の表が自動的に SET INTEGRITYペンディング状態になりました。SQLSTATE=01586
©日本IBMシステムズ・エンジニアリング(株) Information Management部 85
Set integrityの実行 ID列の更新(続き)
$ db2 set integrity for test5 immediate checked DB20000I SQL コマンドが正常に終了しました。
$ db2 "select * from test5"
C1 C2 C3
---1 ---1 ---1 26 26 2 51 51 3 76 76 4 101 101 1
$ db2 set integrity for test5 generate identity immediate checked
DB20000I SQL コマンドが正常に終了しました。
$ db2 "select * from test5"
C1 C2 C3
---1 ---1 ---1 26 26 2 51 51 3 76 76 4 101 101 5