ブロックレベル圧縮（BLC)の方法と効果検証

# 目的
ブロックレベル圧縮（BLC)の効果を検証

# 前提
### ブロックレベル圧縮（BLC)に必要な設定

1. DBS制御フィールド BlockLevelCompression の設定
1. 表のBLOCKCOMPRESSIONオプション
1. データ挿入時のクエリーバンド

# 手順（概要）

1. 空テーブルt3, t4を作成
2. 同様のデータをt3：圧縮無、t4：圧縮有で挿入
3. 容量を比較


# 手順（詳細）

### 空テーブルt3, t4を作成

```
Create table t3(
c1 integer,
c2 char(1),
c3 char(4),
c4 varchar(10),
c5 varchar(30),
c6 date format 'YYYY-MM-DD',
c7 integer
) unique primary index (c1);

Create table t4(
c1 integer,
c2 char(1),
c3 char(4),
c4 varchar(10),
c5 varchar(30),
c6 date format 'YYYY-MM-DD',
c7 integer
) unique primary index (c1);
```

### t3, t4の設定を確認

```
select TableName, BlockCompression, BlockCompressionLevel from dbc.tablesV where TableName in ('t3', 't4');

TableName                    BlockCompression  BlockCompressionLevel
---------------------------  ----------------  ---------------------
t3                           DEFAULT           DEFAULT
t4                           DEFAULT           DEFAULT
```
BlockCompression：DEFAULT
>DBS制御設定のDefaultTableModeに設定されたブロック レベル圧縮がテーブルに使用されます。

### DBS制御設定を確認（圧縮グループ）

```
display compression;

DBS Control Record - Compression (Block Level) Fields:


    1.  BlockLevelCompression                = ON
    2.  (Reserved for future use)
    3.  CompressSpoolDBs                     = NEVER       (ALWAYS, NEVER, IFNOTCACHED)
    4.  (Reserved for future use)
    5.  CompressMloadWorkDBs                 = NEVER       (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
    6.  CompressPJDBs                        = NEVER       (ALWAYS, NEVER)
    7.  MinDBSectsToCompress                 = 32
    8.  MinPercentCompReduction              = 20%
    9.  CompressionAlgorithm                 = ZLIB        (ZLIB, ELZS_H, ELZS_S)
   10.  CompressionLevel                     = 1           (1-9; Default value = 1)
   11.  (Reserved for future use)
   12.  UncompressReservedSpace              = 5%
   13.  (Reserved for future use)
   14.  CompressPermPrimaryDBs               = UNLESSQBNO  (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
   15.  CompressPermFallbackDBs              = UNLESSQBNO  (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
   16.  CompressPermPrimaryCLOBDBs           = UNLESSQBNO  (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
   17.  CompressPermFallbackCLOBDBs          = UNLESSQBNO  (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
   18.  CompressGlobalTempPrimaryDBs         = NEVER       (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
   19.  CompressGlobalTempFallbackDBs        = NEVER       (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
   20.  CompressGlobalTempPrimaryCLOBDBs     = NEVER       (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
   21.  CompressGlobalTempFallbackCLOBDBs    = NEVER       (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
   22 - 31  (Reserved for future use)
   32.  EnableTempBLC                        = FALSE       (TRUE, FALSE)
   33.  DefaultTableMode                     = MANUAL      (AUTOTEMP, MANUAL, ALWAYS, NEVER)
   34.  TempBLCThresh                        = COLD        (COLD, WARM, HOT)
   35.  TempBLCSpread                        = 5%          (1-25%)
   36.  TempBLCInterval                      = 10 minute(s) (1-120)
   37.  TempBLCIOThresh                      = 1           (1-1000)
   38.  TempBLCPriority                      = MEDIUM/DEFAULT (LOW, MEDIUM/DEFAULT, HIGH, RUSH/TOP)
   39.  TempBLCRescanPeriod                  = 7 day(s)     (1-90)
   40.  CompressionZLIBMethod                = IPPZLIB      (ZLIB, IPPZLIB)
   41.  OverrideARCBLC                       = FALSE       (TRUE, FALSE)
```

BlockLevelCompression                = ON
 >BLC機能は有効になります。異なるカテゴリのテーブルのDBは、圧縮グループの他の設定によって、圧縮される場合と圧縮されない場合があります。

DefaultTableMode                     = MANUAL      (AUTOTEMP, MANUAL, ALWAYS, NEVER)
>BLCは、以下のDBS制御フィールドの設定に基づいて適用されます: CompressPermPrimaryDBs、CompressPermFallbackDBs、CompressPermPrimaryCLOBDBs、CompressPermFallbackCLOBDBs。これにより、テーブルが作成される時点におけるそれぞれのテーブル タイプのデフォルトBLCが設定されます。こうしたデフォルトは、ロード時にBLOCKCOMPRESSIONクエリー バンドを使用して上書きできます。

CompressPermPrimaryDBs               = UNLESSQBNO  (ALWAYS, UNLESSQBNO, NEVER, ONLYIFQBYES)
>ロード時に使用されたクエリー バンドで圧縮しないように指定されていない限り、新規のテーブルのDBは圧縮されます。

### クエリバンド（BLOCKCOMPRESSION）を設定し、同様のデータをt3（圧縮無）, t4（圧縮有）に挿入
```
SET QUERY_BAND = 'BLOCKCOMPRESSION=NO;' FOR SESSION;

insert into t3 select * from t1;

 *** Insert completed. 4194309 rows added. 
 *** Total elapsed time was 7 seconds.


SET QUERY_BAND = 'BLOCKCOMPRESSION=YES;' FOR SESSION;

insert into t4 select * from t1;


 *** Insert completed. 4194309 rows added. 
 *** Total elapsed time was 10 seconds.
```
４２０万レコードを挿入
圧縮無：７秒
圧縮有：１０秒

###容量を確認
```
select tablename, sum(currentPerm) from dbc.tableSize where tableName in ('t3', 't4') group by tablename;

TableName                                 Sum(CurrentPerm)
------------------------------  --------------------------
t3                                             469,843,968
t4                                              99,164,160
```
圧縮無：４７０MB
圧縮有：１００MB

→約４．７倍の効果

# 参考
[BLOCKCOMPRESSION • Teradata Vantage™ SQLデータ定義言語 構文規則および例 • リーダー • Teradataドキュメント]
(https://docs.teradata.com/reader/RknaJAFX_2CtUAZfB4_rTA/afLTtJu1hyM0CPh08LCtVQ)
[DefaultTableMode • Teradata Vantage™ - データベース ユーティリティ • リーダー • Teradataドキュメント]
(https://docs.teradata.com/reader/gjXRKe910A9hOE8O2C3Ufw/InbpTdHQBcGseHdh1C5dhQ)
[例: 予約クエリー バンドBLOCKCOMPRESSIONの使用 • Teradata Vantage™ SQLデータ定義言語 構文規則および例 • リーダー • Teradataドキュメント]
(https://docs.teradata.com/reader/RknaJAFX_2CtUAZfB4_rTA/t~NmXx~RJrfUzA1tl9QzpQ)