【備忘録】Db2 パーティション表 デタッチ・アタッチ操作


# 1. はじめに

Db2では**パーティション表**を使用することで、
ひとつの表を複数の区分に分割して、大規模な表の管理を容易にしたり、表データをロールイン・ロールアウトしたり、照会処理を効率化することができます。

パーティション表の作成方法については、以下リンク先の記事をご参照ください。

・Qiita：【備忘録】Db2 パーティション表 作成手順 まとめ
https://qiita.com/Haruka-Ogawa/items/b605021f01b8edb75e83

パーティション表の表データのロールイン・ロールアウトは、
**デタッチ**・**アタッチ** 操作で行います。
今回は Db2 パーティション表における **デタッチ**・**アタッチ** 操作方法について まとめます。


# 2. 準備

パーティション表のデタッチ・アタッチ操作をするにあたって、
Db2環境 と 必要なデータベース・オブジェクトを 準備します。

## 2-1. Db2環境 準備

Db2環境を準備します。
バージョンは v11.5 を使用します。
 Db2の導入方法については、以下リンク先の記事に記載しています。

・Qiita: 【備忘録】Db2 インストール手順まとめ（Linux）
 https://qiita.com/Haruka-Ogawa/items/9576399209b32f3016ea

・Qiita: 【備忘録】Docker版 Db2環境 取得手順 
https://qiita.com/Haruka-Ogawa/items/0a4696ded4fa40e5e983

ここでは Dockerで用意したDb2環境を使用します。

## 2-2. オブジェクト作成

必要なデータベース オブジェクトを作成します。

### ① データベース作成

データベース *SAMPDB* を作成します。
実行例は以下の通りです。

```
$ db2 create db SAMPDB
DB20000I  The CREATE DATABASE command completed successfully.
```

### ② 表スペース作成

まずは 作成したデータベース *SAMPDB* に接続します。
実行例は以下の通りです。

```
$ db2 connect to SAMPDB

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.5.0
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPDB
```


表スペース *TS1*, *TS2*, *TS3*, *TS4* 作成します。
実行例は以下の通りです。

```
$ db2 "CREATE TABLESPACE TS1"
DB20000I  The SQL command completed successfully.
$ db2 "CREATE TABLESPACE TS2"
DB20000I  The SQL command completed successfully.
$ db2 "CREATE TABLESPACE TS3"
DB20000I  The SQL command completed successfully.
$ db2 "CREATE TABLESPACE TS4"
DB20000I  The SQL command completed successfully.
```

・IBM Docs：CREATE TABLESPACE ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-create-tablespace


# 3. デタッチ

## 3-1. 概要

パーティション表では、
デタッチによって、データが古くなったなどで不要になった パーティションを指定して、高速に切り離すことができます。

次項3-2 では、
DATE型の列 *COL2*を パーティション・キーとして *2020-01-01*~*2020-12-31* の1年間を 3ヶ月ごとに分割し、
4つのパーティションを持つ パーティション表 *TBL1* から、
*2020-01-01*~*2020-03-31* を含むパーティション（*PART0*）をデタッチしてみます。

図に示すと、以下の通りになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/c7574cd5-64b9-0cdc-fd79-ca62ae7a7bd4.png)


・IBM Docs：データ・パーティションのデタッチ
https://www.ibm.com/docs/ja/db2/11.5?topic=ranges-detaching-data-partitions



## 3-2. 操作

### ① パーティション表 準備

**CREATE TABLE**コマンドで、パーティション表 TBL1 を作成します。

コマンドは以下の通りです。

```
CREATE TABLE TBL1(COL1 INT, COL2 DATE) 
  IN TS1, TS2, TS3, TS4
  PARTITION BY RANGE(COL2)
  ( STARTING '2020-01-01'
    ENDING '2020-03-31',
    ENDING '2020-06-30',
    ENDING '2020-09-30',
    ENDING '2020-12-31'
  )
```

実行例は以下の通りです。

```
$ db2 "
> CREATE TABLE TBL1(COL1 INT, COL2 DATE) 
>   IN TS1, TS2, TS3, TS4
>   PARTITION BY RANGE(COL2)
>   ( STARTING '2020-01-01'
>     ENDING '2020-03-31',
>     ENDING '2020-06-30',
>     ENDING '2020-09-30',
>     ENDING '2020-12-31'
>   )
> "
DB20000I  The SQL command completed successfully.
```

・IBM Docs：CREATE TABLE ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-create-table


また、**INSERT**コマンドで 値 (*1*,*’2020-01-01’*),(*2*,*’2020-04-01’*),(*3*,*’2020-07-01’*),(*4*,*’2020-10-01’*)を 挿入します。

コマンドは以下の通りです。

```
INSERT INTO TBL1 VALUES(1,'2020-01-01'),(2,'2020-04-01'),(3,'2020-07-01'),(4,'2020-10-01')
```

実行例は以下の通りです。

```
$ db2 "INSERT INTO TBL1 VALUES(1,'2020-01-01'),(2,'2020-04-01'),(3,'2020-07-01'),(4,'2020-10-01')"
DB20000I  The SQL command completed successfully.
```

・IBM Docs：INSERT ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-insert


パーティション表*TBL1*の中身を確認すると、
値 (*1*,*’2020-01-01’*),(*2*,*’2020-04-01’*),(*3*,*’2020-07-01’*),(*4*,*’2020-10-01’*) が挿入されたことがわかります。

```
$ db2 "SELECT * FROM TBL1"

COL1        COL2      
----------- ----------
          1 01/01/2020
          2 04/01/2020
          3 07/01/2020
          4 10/01/2020

  4 record(s) selected.
```

### ② デタッチするパーティション確認

**DESCRIBE** コマンドで、デタッチするパーティションを確認します。

コマンドは以下の通りです。

```
DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL
```

実行例は以下の通りです。

```
$ db2 DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL

PartitionId PartitionName                   TableSpId   PartObjId   IndexTblSpId LongTblSpId AccessMode
                                                                                               Status
----------- ------------------------------- ----------- ----------- ------------ ----------- - ------
          0 PART0                                     3           4            3           3 F                                 
          1 PART1                                     4           4            4           4 F                                 
          2 PART2                                     5           4            5           5 F                                 
          3 PART3                                     6           4            6           6 F                                 

  4 record(s) selected.


PartitionId Inclusive (y/n)                   Inclusive (y/n)
              Low Value                         High Value
----------- - ------------------------------- - -------------------------------
          0 Y '2020-01-01'                    Y '2020-03-31'                   
          1 N '2020-03-31'                    Y '2020-06-30'                   
          2 N '2020-06-30'                    Y '2020-09-30'                   
          3 N '2020-09-30'                    Y '2020-12-31'                   

  4 record(s) selected.

```

今回は パーティション表 *TBL1*の パーティション*PART0* をデタッチします。

・IBM Docs：DESCRIBE コマンド
https://www.ibm.com/docs/ja/db2/11.5?topic=commands-describe


### ③ デタッチ

**ALTER TABLE**コマンドで、
パーティション表*TBL1*の パーティション*PART0* をデタッチします。
またデタッチしたパーティションの宛先として、テーブル*TBL1_EX*を作成します。

コマンドは以下の通りです。

```
ALTER TABLE TBL1 DETACH PARTITION PART0 INTO TBL1_EX
```

実行例は以下の通りです。

```
$ db2 "ALTER TABLE TBL1 DETACH PARTITION PART0 INTO TBL1_EX"
DB20000I  The SQL command completed successfully.
```

・IBM Docs：ALTER TABLE ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-alter-table


### ④ 確認

テーブル一覧を確認すると、テーブル*TBL1_EX*が作成されていることがわかります。

```
$ db2 list tables

Table/View                      Schema          Type  Creation time             
------------------------------- --------------- ----- --------------------------
TBL1                            DB2INST1        T     2021-04-15-09.22.02.437327
TBL1_EX                         DB2INST1        T     2021-04-15-09.56.52.955792

  2 record(s) selected.
```


- **デタッチした表(TBL1)**

**DESCRIBE** コマンドで、デタッチした後のパーティション表 *TBL1* を確認します。

コマンドは以下の通りです。

```
DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL
```

実行例は以下の通りです。

```
$ db2 DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL

PartitionId PartitionName                   TableSpId   PartObjId   IndexTblSpId LongTblSpId AccessMode
                                                                                               Status
----------- ------------------------------- ----------- ----------- ------------ ----------- - ------
          1 PART1                                     4           4            4           4 F                                 
          2 PART2                                     5           4            5           5 F                                 
          3 PART3                                     6           4            6           6 F                                 

  3 record(s) selected.


PartitionId Inclusive (y/n)                   Inclusive (y/n)
              Low Value                         High Value
----------- - ------------------------------- - -------------------------------
          1 N '2020-03-31'                    Y '2020-06-30'                   
          2 N '2020-06-30'                    Y '2020-09-30'                   
          3 N '2020-09-30'                    Y '2020-12-31'                   

  3 record(s) selected.

```

デタッチされたことによって、
パーティション *PART0* が表示されていません。

また、**AccessMode** **Status**が、'*F*' であることから、パーティション表*TBL1*へのパーティション にフル・アクセス可能であることがわかります。  

・IBM Docs：DESCRIBE コマンド
https://www.ibm.com/docs/ja/db2/11.5?topic=commands-describe

パーティション表*TBL1* の中身を確認します。

```
$ db2 "SELECT * FROM TBL1"

COL1        COL2      
----------- ----------
          2 04/01/2020
          3 07/01/2020
          4 10/01/2020

  3 record(s) selected.
```

値(*1*, *’01/01/2020’*)がなく、
*2020-01-01*~*2020-03-31* を含むパーティション（*PART0*）がデタッチされたことがわかります。

                                                                                

- **ターゲット表（TBL1_EX)**

**DESCRIBE** コマンドで、デタッチ時 作成した ターゲット表 *TBL1_EX* を確認します。

```
$ db2 "SELECT * FROM TBL1_EX"

COL1        COL2      
----------- ----------
          1 01/01/2020

  1 record(s) selected.
```

パーティション表 *TBL1* のパーティション *PART0* が、
テーブル *TBL1_EX* へデタッチされたことがわかりました。

# 4. アタッチ

## 4-1. 概要

パーティション表では、
**アタッチ**操作によって、新しいパーティションを テーブルに  高速に取り付けることができます。

次項目4-2では、
DATE型の列 *COL2*を パーティション・キーとして *2020-01-01*~*2020-12-31* の1年間を 3ヶ月ごとに分割し、
4つのパーティションを持つ パーティション表 *TBL1* に、
*2021-01-01*~*2021-03-31* を含む新規パーティションをアタッチしてみます。

図に示すと、以下の通りになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/1ab171c8-98fc-32c2-2326-bbd9cd814afe.png)


・IBM Docs：データ・パーティションのアタッチ
https://www.ibm.com/docs/ja/db2/11.5?topic=ranges-attaching-data-partitions


## 4-2. 操作

### ① パーティション表 準備

**CREATE TABLE**コマンドで、パーティション表 *TBL1* を作成します。

コマンドは以下の通りです。

```
CREATE TABLE TBL1(COL1 INT, COL2 DATE) 
  IN TS1, TS2, TS3, TS4
  PARTITION BY RANGE(COL2)
  ( STARTING '2020-01-01'
    ENDING '2020-03-31',
    ENDING '2020-06-30',
    ENDING '2020-09-30',
    ENDING '2020-12-31'
  )
```

実行例は以下の通りです。

```
$ db2 "
> CREATE TABLE TBL1(COL1 INT, COL2 DATE) 
>   IN TS1, TS2, TS3, TS4
>   PARTITION BY RANGE(COL2)
>   ( STARTING '2020-01-01'
>     ENDING '2020-03-31',
>     ENDING '2020-06-30',
>     ENDING '2020-09-30',
>     ENDING '2020-12-31'
>   )
> "
DB20000I  The SQL command completed successfully.
```

・IBM Docs：CREATE TABLE ステートメント 
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-create-table


また、**INSERT**コマンドで 値 (*1*,*’2020-01-01’*),(*2*,*’2020-04-01’*),(*3*,*’2020-07-01’*),(*4*,*’2020-10-01’*)を 挿入します。

コマンドは以下の通りです。

```
INSERT INTO TBL1 VALUES(1,'2020-01-01'),(2,'2020-04-01'),(3,'2020-07-01'),(4,'2020-10-01')
```

実行例は以下の通りです。

```
$ db2 "INSERT INTO TBL1 VALUES(1,'2020-01-01'),(2,'2020-04-01'),(3,'2020-07-01'),(4,'2020-10-01')"
DB20000I  The SQL command completed successfully.
```

・IBM Docs：INSERT ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-insert


パーティション表*TBL1*の中身を確認すると、
値 (*1*,*’2020-01-01’*),(*2*,*’2020-04-01’*),(*3*,*’2020-07-01’*),(*4*,*’2020-10-01’*) が挿入されたことがわかります。

```
$ db2 "SELECT * FROM TBL1"

COL1        COL2      
----------- ----------
          1 01/01/2020
          2 04/01/2020
          3 07/01/2020
          4 10/01/2020

  4 record(s) selected.
```

### ② アタッチする表 準備

**CREATE TABLE**コマンドで、アタッチするテーブル*TBL1_NEW*を作成します。
また、**INSERT**コマンドで 作成した表*TBL1_NEW*に データ(*1, '2021-01-01’*)を挿入します。

コマンドは以下の通りです。

```
CREATE TABLE TBL1_NEW(COL1 INT, COL2 DATE) IN TS5
INSERT INTO TBL1_NEW VALUES(1, '2021-01-01')
```

実行例は以下の通りです。

```
$ db2 "CREATE TABLE TBL1_NEW(COL1 INT, COL2 DATE) IN TS5"
DB20000I  The SQL command completed successfully.

$ db2 "INSERT INTO TBL1_NEW VALUES(5, '2021-01-01')"
DB20000I  The SQL command completed successfully.
```

作成した テーブル*TBL1_NEW*の中身を確認すると、以下の通りです。

```
$ db2 "SELECT * FROM TBL1_NEW"

COL1        COL2      
----------- ----------
          5 01/01/2021

  1 record(s) selected.
```

・IBM Docs：CREATE TABLE ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-create-table

・IBM Docs：INSERT ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-insert


### ③ アタッチ

**ALTER TABLE**コマンドで、
パーティション表*TBL1*に 表*TBL1_NEW* をアタッチします。
また アタッチしたパーティションの範囲（開始値・終了値)を、*’2021-01-01’*~*’2021-03-31’*に設定します。

コマンドは以下の通りです。

```
ALTER TABLE TBL1 ATTACH PARTITION STARTING ('2021-01-01') ENDING('2021-03-31') FROM TBL1_NEW
```

実行例は以下の通りです。

```
$ db2 "ALTER TABLE TBL1 ATTACH PARTITION STARTING ('2021-01-01') ENDING('2021-03-31') FROM TBL1_NEW"
SQL3601W  The statement caused one or more tables to automatically be placed 
in the Set Integrity Pending state.  SQLSTATE=01586
```

SQLメッセージ **SQL3601W** が返されており、
アタッチによって、テーブルが SET INTEGRITY ペンディング状態になったことがわかります。

ペンディングを解除するために、この後 **SET INTEGRITY** コマンドを実行します。

・IBM Docs：ALTER TABLE ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-alter-table

・IBM Docs：SQL3500 - SQL3749
https://www.ibm.com/docs/ja/db2/11.5?topic=SSEPGG_11.5.0/com.ibm.db2.luw.messages.sql.doc/sql3500-sql3749.html#sql3601w


### ④ 確認

**DESCRIBE**コマンドで、アタッチした表 *TBL1*を確認します。

コマンドは以下の通りです。

```
DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL
```

実行例は以下の通りです。

```
$ db2 DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL

PartitionId PartitionName                   TableSpId   PartObjId   IndexTblSpId LongTblSpId AccessMode
                                                                                               Status
----------- ------------------------------- ----------- ----------- ------------ ----------- - ------
          0 PART0                                     3           4            3           3 F                                 
          1 PART1                                     4           4            4           4 F                                 
          2 PART2                                     5           4            5           5 F                                 
          3 PART3                                     6           4            6           6 F                                 
          4 PART4                                     7           4            7           7 N A                               

  5 record(s) selected.


PartitionId Inclusive (y/n)                   Inclusive (y/n)
              Low Value                         High Value
----------- - ------------------------------- - -------------------------------
          0 Y '2020-01-01'                    Y '2020-03-31'                   
          1 N '2020-03-31'                    Y '2020-06-30'                   
          2 N '2020-06-30'                    Y '2020-09-30'                   
          3 N '2020-09-30'                    Y '2020-12-31'                   
          4 Y '2021-01-01'                    Y '2021-03-31'                   

  5 record(s) selected.

```

新たに アタッチした パーティション *PART4*が 表示されています。

また、パーティション *PART4*の **AccessMode** **Status**が '*N* *A*' であることから、
アタッチによって、アクセス不可になっていることがわかります。

・IBM Docs：DESCRIBE コマンド
https://www.ibm.com/docs/ja/db2/11.5?topic=commands-describe

・IBM Docs：SYSCAT.DATAPARTITIONS カタログ・ビュー
https://www.ibm.com/docs/ja/db2/11.5?topic=views-syscatdatapartitions

### ⑤ ペンディング 解除

**SET INTEGRITY**コマンドで 新しくアタッチしたパーティションの値の範囲を検査し、
表*TBL1*のペンディングを解除します。

コマンドは以下の通りです。

```
SET INTEGRITY FOR TBL1 IMMEDIATE CHECKED
```

実行例は以下の通りです。

```
$ db2 SET INTEGRITY FOR TBL1 IMMEDIATE CHECKED
DB20000I  The SQL command completed successfully.
```

・IBM Docs：SET INTEGRITY ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-set-integrity

### ⑥ 確認

**DESCRIBE**コマンドで、アタッチした表 *TBL1*を確認します。

コマンドは以下の通りです。

```
DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL
```

実行例は以下の通りです。

```
$ db2 DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL

PartitionId PartitionName                   TableSpId   PartObjId   IndexTblSpId LongTblSpId AccessMode
                                                                                               Status
----------- ------------------------------- ----------- ----------- ------------ ----------- - ------
          0 PART0                                     3           4            3           3 F                                 
          1 PART1                                     4           4            4           4 F                                 
          2 PART2                                     5           4            5           5 F                                 
          3 PART3                                     6           4            6           6 F                                 
          4 PART4                                     7           4            7           7 F                                 

  5 record(s) selected.


PartitionId Inclusive (y/n)                   Inclusive (y/n)
              Low Value                         High Value
----------- - ------------------------------- - -------------------------------
          0 Y '2020-01-01'                    Y '2020-03-31'                   
          1 N '2020-03-31'                    Y '2020-06-30'                   
          2 N '2020-06-30'                    Y '2020-09-30'                   
          3 N '2020-09-30'                    Y '2020-12-31'                   
          4 Y '2021-01-01'                    Y '2021-03-31'                   

  5 record(s) selected.

```

アタッチしたパーティション *PART4*の **AccessMode** **Status**が、'*F*' になっていることから、
ペンディングが解除され、アクセス可能になったことがわかります。  

・IBM Docs：DESCRIBE コマンド
https://www.ibm.com/docs/ja/db2/11.5?topic=commands-describe


パーティション表*TBL1* の中身を確認します。


```
$ db2 "SELECT * FROM TBL1"

COL1        COL2      
----------- ----------
          1 01/01/2020
          2 04/01/2020
          3 07/01/2020
          4 10/01/2020
          5 01/01/2021

  5 record(s) selected.
```

値 (*5*,*’2021-01-01’*)があることから、
無事 アタッチされたことがわかりました。


# 5. パーティション追加 

## 5-1. 概要

パーティション表では、
新しい空のパーティションを テーブルに追加することができます。

次項目 5-2では、
DATE型の列 *COL2*を パーティション・キーとして *2020-01-01*~*2020-12-31* の1年間を 3ヶ月ごとに分割し、
4つのパーティションを持つ パーティション表 *TBL1* に、
*2021-01-01*~*2021-03-31* を範囲とする 空のパーティションを追加してみます。

図に示すと、以下の通りになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/c11bab95-03bb-1605-14e3-e84125ed47d3.png)


・IBM Docs：パーティション表へのデータ・パーティションの追加
https://www.ibm.com/docs/ja/db2/11.5?topic=ranges-adding-data-partitions

## 5-2. 操作

### ① パーティション表 準備

**CREATE TABLE**コマンドで、パーティション表 TBL1 を作成します。

コマンドは以下の通りです。

```
CREATE TABLE TBL1(COL1 INT, COL2 DATE) 
  IN TS1, TS2, TS3, TS4
  PARTITION BY RANGE(COL2)
  ( STARTING '2020-01-01'
    ENDING '2020-03-31',
    ENDING '2020-06-30',
    ENDING '2020-09-30',
    ENDING '2020-12-31'
  )
```

実行例は以下の通りです。

```
$ db2 "
> CREATE TABLE TBL1(COL1 INT, COL2 DATE) 
>   IN TS1, TS2, TS3, TS4
>   PARTITION BY RANGE(COL2)
>   ( STARTING '2020-01-01'
>     ENDING '2020-03-31',
>     ENDING '2020-06-30',
>     ENDING '2020-09-30',
>     ENDING '2020-12-31'
>   )
> "
DB20000I  The SQL command completed successfully.
```

パーティション表*TBL1*が作成できました。

・IBM Docs：CREATE TABLE ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-create-table


**INSERT**コマンドで、試しにパーティション表*TBL1*に 値(*1*, *’2021-01-01’*)を挿入すると、
パーティションの範囲外のため 挿入ができないことがわかります。

```
$ db2 "INSERT INTO TBL1 VALUES(1, '2021-01-01')"
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0327N  The row cannot be inserted into table "DB2INST1.TBL1" because it is 
outside the bounds of the defined data partition ranges.  SQLSTATE=22525
```

・IBM Docs：DB20000 - DB29999
https://www.ibm.com/docs/ja/db2/11.5?topic=SSEPGG_11.5.0/com.ibm.db2.luw.messages.db2.doc/db20000-db29999.html

・IBM Docs：SQL0250 - SQL0499
https://www.ibm.com/docs/ja/db2/11.5?topic=SSEPGG_11.5.0/com.ibm.db2.luw.messages.sql.doc/sql0250-sql0499.html

### ② 確認

**DESCRIBE**コマンドで、作成した表 *TBL1*を確認します。

コマンドは以下の通りです。

```
DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL
```

実行例は以下の通りです。


```
$ db2 DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL

PartitionId PartitionName                   TableSpId   PartObjId   IndexTblSpId LongTblSpId AccessMode
                                                                                               Status
----------- ------------------------------- ----------- ----------- ------------ ----------- - ------
          0 PART0                                     3           4            3           3 F                                 
          1 PART1                                     4           4            4           4 F                                 
          2 PART2                                     5           4            5           5 F                                 
          3 PART3                                     6           4            6           6 F                                 

  4 record(s) selected.


PartitionId Inclusive (y/n)                   Inclusive (y/n)
              Low Value                         High Value
----------- - ------------------------------- - -------------------------------
          0 Y '2020-01-01'                    Y '2020-03-31'                   
          1 N '2020-03-31'                    Y '2020-06-30'                   
          2 N '2020-06-30'                    Y '2020-09-30'                   
          3 N '2020-09-30'                    Y '2020-12-31'                   

  4 record(s) selected.
```

・IBM Docs：DESCRIBE コマンド
https://www.ibm.com/docs/ja/db2/11.5?topic=commands-describe


### ③ パーティション追加

**ALTER TABLE**コマンドで、範囲が*2021-01-01*~*2021-03-31*の パーティションを追加します。
コマンドは以下の通りです。

```
ALTER TABLE TBL1 ADD PARTITION
  STARTING '2021-01-01'
  ENDING '2021-03-31' IN TS5
```

実行例は以下の通りです。

```
$ db2 "
> ALTER TABLE TBL1 ADD PARTITION
>   STARTING '2021-01-01'
>   ENDING '2021-03-31' IN TS5
> "
DB20000I  The SQL command completed successfully.
```

パーティション追加ができました。

・IBM Docs：ALTER TABLE ステートメント
https://www.ibm.com/docs/ja/db2/11.5?topic=statements-alter-table


### ④ 確認

**DESCRIBE**コマンドで、パーティションを追加した 表 *TBL1*を確認します。

コマンドは以下の通りです。

```
DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL
```

実行例は以下の通りです。

```
$ db2 DESCRIBE DATA PARTITIONS FOR TABLE TBL1 SHOW DETAIL

PartitionId PartitionName                   TableSpId   PartObjId   IndexTblSpId LongTblSpId AccessMode
                                                                                               Status
----------- ------------------------------- ----------- ----------- ------------ ----------- - ------
          0 PART0                                     3           4            3           3 F                                 
          1 PART1                                     4           4            4           4 F                                 
          2 PART2                                     5           4            5           5 F                                 
          3 PART3                                     6           4            6           6 F                                 
          4 PART4                                     7           4            7           7 F                                 

  5 record(s) selected.


PartitionId Inclusive (y/n)                   Inclusive (y/n)
              Low Value                         High Value
----------- - ------------------------------- - -------------------------------
          0 Y '2020-01-01'                    Y '2020-03-31'                   
          1 N '2020-03-31'                    Y '2020-06-30'                   
          2 N '2020-06-30'                    Y '2020-09-30'                   
          3 N '2020-09-30'                    Y '2020-12-31'                   
          4 Y '2021-01-01'                    Y '2021-03-31'                   

  5 record(s) selected.
```

*2021-01-01*~*2021-03-31*を範囲とする パーティション *PART4* が追加されていることがわかります。

・IBM Docs：DESCRIBE コマンド
https://www.ibm.com/docs/ja/db2/11.5?topic=commands-describe


試しに、**INSERT**コマンドで、パーティション表*TBL1*に 値(*1*, *’2021-01-01’*)を挿入すると、
パーティションの範囲内のため 挿入ができることがわかります。

```
$ db2 "INSERT INTO TBL1 VALUES(1, '2021-01-01')"
DB20000I  The SQL command completed successfully.

$ db2 "SELECT * FROM TBL1"

COL1        COL2      
----------- ----------
          1 01/01/2021

  1 record(s) selected.
```

# 6. おわりに

今回は、パーティション表における **デタッチ**・**アタッチ**、**パーティション追加** 操作を確認しました。

パーティション表の デタッチ・アタッチの処理では、データの移動が発生しないので、
高速にデータを 追加・削除したい時に 活用することができます。


# 参考情報

・IBM Docs：パーティション表
https://www.ibm.com/docs/ja/db2/11.5?topic=schemes-partitioned-tables

・[ThinkIT] 第2回：大規模データベースでも威力発揮！ 
https://thinkit.co.jp/free/article/0707/19/2/