• 検索結果がありません。

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

関連したドキュメント