投稿者「三原健一」のアーカイブ

Flashback Dropの検証③

容量管理はどうなっているか?

前回はFlashback Dropの基本的な動作を確認した。

テーブルを削除すると「リサイクルビン」という特別な場所に移動されるわけではなく、同じ表領域にセグメントとして存在しつつもエクステント情報から見えなくなるだけであることがわかった。

また、削除されたテーブルとそれに紐づくインデックスとPK制約は、BIN$で始まる名前にRenameされる。
そして、Flashback Dropによって削除前に戻されたテーブルは、元の名前に戻るが(任意の名前にすることは可能)インデックスとPK制約はBIN$で始まる名前から元に戻ることがないこともわかった。

それでは削除されたオブジェクトが「リサイクルビン」セグメントとして表領域の中に溜まっていった場合、有限な表領域はいずれ一杯になってしまうはずである。
WindowsやMacOSの場合明示的にゴミ箱を空にしないとディスク領域は解放されないが、OracleのリサイクルビンもPERGEコマンドを発行しないと解放されないのであろうか?

マニュアルをよく読めば答えは書いてあるのだが、実際に確かめてみよう。

JPOUG20160223.001

初期状態

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_EXT%
----------
        60


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_SEG%
----------
        60


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                48              80           60


レコードが選択されませんでした。

EMP表をコピーしてEMP1表を作成する

CTAS(Create Table As Select)でEMP表からEMP1表を作成する。

SQL> create table EMP1 as select * from EMP;

表が作成されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP1                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

6行が選択されました。


  TOT_EXT%
----------
        70


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP1                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

6行が選択されました。


  TOT_SEG%
----------
        70


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                56              80           70


レコードが選択されませんでした。

EMP1表にインデックスを作成する

SQL> create unique index PK_EMP1 on EMP1 (EMPNO);

索引が作成されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP1                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP1                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

7行が選択されました。


  TOT_EXT%
----------
        80


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP1                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP1                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

7行が選択されました。


  TOT_SEG%
----------
        80


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP
PK_EMP1                          EMP1


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- -----------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                64              80           80


レコードが選択されませんでした。

インデックスPK_EMP1を作成したところまでを図にすると以下のようになる。

JPOUG20160223.018

EMP1表をDropする

SQL> drop table EMP1;

表が削除されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_EXT%
----------
        60


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
BIN$YDcoyDClRYqEdI1NlIY3ng==$0   INDEX           TS_SMALL                 8
BIN$fwT/IhomQvm3rrv7SMAEIA==$0   TABLE           TS_SMALL                 8
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

7行が選択されました。


  TOT_SEG%
----------
        80


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                48              80           60


--- リサイクルビン情報 ---
OBJECT_NAME                      ORIGINAL_NAME   OPERATION  TYPE       TS_NAME       DROPSCN CAN_UN CAN_PU
-------------------------------- --------------- ---------- ---------- ---------- ---------- ------ ------
BIN$YDcoyDClRYqEdI1NlIY3ng==$0   PK_EMP1         DROP       INDEX      TS_SMALL      3324538 NO     YES
BIN$fwT/IhomQvm3rrv7SMAEIA==$0   EMP1            DROP       TABLE      TS_SMALL      3324542 YES    YES

JPOUG20160223.019
エクステントの空き領域が初期状態と同じ40%になっているが、セグメントの空き領域が20%となっていることに注目してもらいたい。

EMP2表とインデックスを作成する

SQL> create table EMP2 as select * from EMP;

表が作成されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP2                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

6行が選択されました。


  TOT_EXT%
----------
        70


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
BIN$YDcoyDClRYqEdI1NlIY3ng==$0   INDEX           TS_SMALL                 8
BIN$fwT/IhomQvm3rrv7SMAEIA==$0   TABLE           TS_SMALL                 8
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP2                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

8行が選択されました。


  TOT_SEG%
----------
        90


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                56              80           70


--- リサイクルビン情報 ---
OBJECT_NAME                      ORIGINAL_NAME   OPERATION  TYPE       TS_NAME       DROPSCN CAN_UN CAN_PU
-------------------------------- --------------- ---------- ---------- ---------- ---------- ------ ------
BIN$YDcoyDClRYqEdI1NlIY3ng==$0   PK_EMP1         DROP       INDEX      TS_SMALL      3324538 NO     YES
BIN$fwT/IhomQvm3rrv7SMAEIA==$0   EMP1            DROP       TABLE      TS_SMALL      3324542 YES    YES


SQL> create unique index PK_EMP2 on EMP2 (EMPNO);

索引が作成されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP2                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP2                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

7行が選択されました。


  TOT_EXT%
----------
        80


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
BIN$YDcoyDClRYqEdI1NlIY3ng==$0   INDEX           TS_SMALL                 8
BIN$fwT/IhomQvm3rrv7SMAEIA==$0   TABLE           TS_SMALL                 8
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP2                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP2                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

9行が選択されました。


  TOT_SEG%
----------
       100


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP
PK_EMP2                          EMP2


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                64              80           80


--- リサイクルビン情報 ---
OBJECT_NAME                      ORIGINAL_NAME   OPERATION  TYPE       TS_NAME       DROPSCN CAN_UN CAN_PU
-------------------------------- --------------- ---------- ---------- ---------- ---------- ------ ------
BIN$YDcoyDClRYqEdI1NlIY3ng==$0   PK_EMP1         DROP       INDEX      TS_SMALL      3324538 NO     YES
BIN$fwT/IhomQvm3rrv7SMAEIA==$0   EMP1            DROP       TABLE      TS_SMALL      3324542 YES    YES

JPOUG20160223.020
この時点で、セグメント使用率が100%に達していることがわかる。

EMP2表をDropする

ここでEMP2表を削除して表領域使用率を初期状態と同じ60%にしてみよう。

SQL> drop table EMP2;

表が削除されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_EXT%
----------
        60


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
BIN$SyavBrvpRz6HQHACx2Ln7Q==$0   INDEX           TS_SMALL                 8
BIN$YDcoyDClRYqEdI1NlIY3ng==$0   INDEX           TS_SMALL                 8
BIN$c3jA6BZKTGOkGUgJI69p8g==$0   TABLE           TS_SMALL                 8
BIN$fwT/IhomQvm3rrv7SMAEIA==$0   TABLE           TS_SMALL                 8
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

9行が選択されました。


  TOT_SEG%
----------
       100


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                48              80           60


--- リサイクルビン情報 ---
OBJECT_NAME                      ORIGINAL_NAME   OPERATION  TYPE       TS_NAME       DROPSCN CAN_UN CAN_PU
-------------------------------- --------------- ---------- ---------- ---------- ---------- ------ ------
BIN$YDcoyDClRYqEdI1NlIY3ng==$0   PK_EMP1         DROP       INDEX      TS_SMALL      3324538 NO     YES
BIN$fwT/IhomQvm3rrv7SMAEIA==$0   EMP1            DROP       TABLE      TS_SMALL      3324542 YES    YES
BIN$SyavBrvpRz6HQHACx2Ln7Q==$0   PK_EMP2         DROP       INDEX      TS_SMALL      3324984 NO     YES
BIN$c3jA6BZKTGOkGUgJI69p8g==$0   EMP2            DROP       TABLE      TS_SMALL      3324988 YES    YES

JPOUG20160223.021
表領域としては40%の空きが確保できたが、セグメントは100%使用されている状態である。

この状態でさらにオブジェクトを作成してどうなるかを確認しよう。

EMP3表を作成する

ここからはオブジェクトを1つずつ作成する。

SQL> create table EMP3 as select * from EMP;

表が作成されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

6行が選択されました。


  TOT_EXT%
----------
        70


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
BIN$SyavBrvpRz6HQHACx2Ln7Q==$0   INDEX           TS_SMALL                 8
BIN$c3jA6BZKTGOkGUgJI69p8g==$0   TABLE           TS_SMALL                 8
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

8行が選択されました。


  TOT_SEG%
----------
        90


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                56              80           70


--- リサイクルビン情報 ---
OBJECT_NAME                      ORIGINAL_NAME   OPERATION  TYPE       TS_NAME       DROPSCN CAN_UN CAN_PU
-------------------------------- --------------- ---------- ---------- ---------- ---------- ------ ------
BIN$SyavBrvpRz6HQHACx2Ln7Q==$0   PK_EMP2         DROP       INDEX      TS_SMALL      3324984 NO     YES
BIN$c3jA6BZKTGOkGUgJI69p8g==$0   EMP2            DROP       TABLE      TS_SMALL      3324988 YES    YES

まず、EMP1に該当するリサイクルビン・セグメントが解放され、EMP1に紐づくPK_EMP1も解放される。

これはDROPSCNの小さい、つまり先にDropされたものから解放される仕様となっているので、正確にはPK_EMP1 → EMP1の順に解放される。

20%分が解放され10%分が消費されたので、セグメントは差し引き90%使用されていることになる。

PK_EMP3を作成する

SQL> create unique index PK_EMP3 on EMP3 (EMPNO);

索引が作成されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP3                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

7行が選択されました。


  TOT_EXT%
----------
        80


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
BIN$SyavBrvpRz6HQHACx2Ln7Q==$0   INDEX           TS_SMALL                 8
BIN$c3jA6BZKTGOkGUgJI69p8g==$0   TABLE           TS_SMALL                 8
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP3                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

9行が選択されました。


  TOT_SEG%
----------
       100


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP
PK_EMP3                          EMP3


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                64              80           80


--- リサイクルビン情報 ---
OBJECT_NAME                      ORIGINAL_NAME   OPERATION  TYPE       TS_NAME       DROPSCN CAN_UN CAN_PU
-------------------------------- --------------- ---------- ---------- ---------- ---------- ------ ------
BIN$SyavBrvpRz6HQHACx2Ln7Q==$0   PK_EMP2         DROP       INDEX      TS_SMALL      3324984 NO     YES
BIN$c3jA6BZKTGOkGUgJI69p8g==$0   EMP2            DROP       TABLE      TS_SMALL      3324988 YES    YES

JPOUG20160223.022

図はリサイクルビンの2つのオブジェクトを解放し、新たな2つのオブジェクトを作成したところである。

EMP4およびPK_EMP4を作成する

SQL> create table EMP4 as select * from EMP;

表が作成されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
EMP4                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP3                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

8行が選択されました。


  TOT_EXT%
----------
        90


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
EMP4                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP3                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

8行が選択されました。


  TOT_SEG%
----------
        90


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP
PK_EMP3                          EMP3


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                72              80           90


レコードが選択されませんでした。

SQL> create unique index PK_EMP4 on EMP4 (EMPNO);

索引が作成されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
EMP4                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP3                          INDEX           TS_SMALL                 8
PK_EMP4                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

9行が選択されました。


  TOT_EXT%
----------
       100


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
EMP4                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP3                          INDEX           TS_SMALL                 8
PK_EMP4                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

9行が選択されました。


  TOT_SEG%
----------
       100


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP
PK_EMP3                          EMP3
PK_EMP4                          EMP4


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                80              80          100


レコードが選択されませんでした。

JPOUG20160223.023

EMP2、PK_EMP2に該当するリサイクルビン・オブジェクトが解放され新たなオブジェクトが作成された。表領域の使用率は100%である。

ここまで、明示的なPURGE RECYCLEBINコマンドは一度も発行していない。つまりリサイクルビン・オブジェクトにより表領域中のセグメントが100%使用されていたとしても、Oracleは古いものから適宜解放し、新たなオブジェクトを作成する領域を自動的に確保する。

PK_EMP4のみ削除する

テーブルを削除するとテーブルに紐づくインデックスも自動的にリサイクルビンで管理されることはわかったが、インデックスのみ削除した場合はどうなるだろうか?

SQL> drop index PK_EMP4;

索引が削除されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
EMP4                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP3                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

8行が選択されました。


  TOT_EXT%
----------
        90


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
EMP3                             TABLE           TS_SMALL                 8
EMP4                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
PK_EMP3                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8

8行が選択されました。


  TOT_SEG%
----------
        90


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP
PK_EMP3                          EMP3


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                72              80           90


レコードが選択されませんでした。


JPOUG20160223.024

インデックスのみを削除してもリサイクルビンでは管理されない。単純に削除されて領域も解放される。

これは考えてみれば簡単なのだが、テーブルがあればインデックスは何度でも再作成可能なためである。

今日はここまで

Flashback Dropの検証②

前回のおさらい

JPOUG20160223.001

Flashback Dropの検証を行う環境の初期状態である。

オブジェクトはテーブルとインデックス、あわせて5つ。すべて1エクステント=8ブロック=64KBずつを占めている。これの他に表領域の管理情報と思われる1エスクテント分を合せて480KBの領域となるので、全体(640KB)に対する使用率は60%、空き領域は40%となっている。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_EXT%
----------
        60


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_SEG%
----------
        60


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                48              80           60


レコードが選択されませんでした。

EMP表をDropする。

それでは、まず最初にEMP表をDropして状況を確認してみる。

SQL> drop table EMP;

表が削除されました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_EXT%
----------
        40


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
BIN$IM3P5MOwSlazE4G+zy6X3w==$0   INDEX           TS_SMALL                 8
BIN$TduxVYG8Q5mq7BFKwzmeuw==$0   TABLE           TS_SMALL                 8
DEPT                             TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_SEG%
----------
        60


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
BIN$YIfQE0ilRXy+VvPcGtg1WA==$0   BIN$TduxVYG8Q5mq7BFKwzmeuw==$0   P  BIN$IM3P5MOwSlazE4G+zy6X3w==$0   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                32              80           40


--- リサイクルビン情報 ---
OBJECT_NAME                      ORIGINAL_NAME   OPERATION  TYPE       TS_NAME       DROPSCN CAN_UN CAN_PU
-------------------------------- --------------- ---------- ---------- ---------- ---------- ------ ------
BIN$IM3P5MOwSlazE4G+zy6X3w==$0   PK_EMP          DROP       INDEX      TS_SMALL      3323577 NO     YES
BIN$TduxVYG8Q5mq7BFKwzmeuw==$0   EMP             DROP       TABLE      TS_SMALL      3323581 YES    YES

テーブルとインデックスが「BIN$」で始まる名前にRenameされているだけでなく、PK制約もRenameされていることがわかる。

しかし、リサイクルビン情報にはFK制約の情報はない。つまり削除されている。

また、USER_RECYCLEBIN.CAN_UNDROP列を見ると、テーブルは「YES」となっているのに、インデックスの方は「NO」となっている。この違いについては次の操作で明らかになるので追って解説する。

さらに、セグメント情報を見ると、Dropされたオブジェクトは依然として「TS_SMALL」表領域内に存在していることがわかる。つまり、Drop(削除)されてゴミ箱(リサイクルビン)に入るというのは概念的なことであって、物理的には同じ表領域に存在しているのである。

SYSAUX表領域などに移動されるわけではない。

EMP表をDropした状態を図に示すと以下のようになる。

JPOUG20160223.012

JPOUG20160223.013
参照整合性制約(FK_EMP)については、リサイクルビンで管理されることなく即時に削除されていることがわかる。

Flashback Drop実行

それでは「FLASHBACK TABLE」コマンドにより、EMP表を削除前に戻してみよう。

SQL> flashback table EMP to before drop;

フラッシュバックが完了しました。

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
BIN$IM3P5MOwSlazE4G+zy6X3w==$0   INDEX           TS_SMALL                 8
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_EXT%
----------
        60


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
BIN$IM3P5MOwSlazE4G+zy6X3w==$0   INDEX           TS_SMALL                 8
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_SEG%
----------
        60


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
BIN$IM3P5MOwSlazE4G+zy6X3w==$0   EMP
PK_DEPT                          DEPT


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
BIN$YIfQE0ilRXy+VvPcGtg1WA==$0   EMP                              P  BIN$IM3P5MOwSlazE4G+zy6X3w==$0   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                48              80           60


レコードが選択されませんでした。

SQL> Insert into FD.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7934,'MILLER','CLERK',7782,to_date('82-01-23','RR-MM-DD'),1300,null,10);
Insert into FD.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7934,'MILLER','CLERK',7782,to_date('82-01-23','RR-MM-DD'),1300,null,10)
*
行1でエラーが発生しました。:
ORA-00001: 一意制約(FD.BIN$YIfQE0ilRXy+VvPcGtg1WA==$0)に反しています

エクステントが復活したために、空き領域は初期状態の40%に戻っている。

テーブルは削除前と同じ名前に戻ったが、インデックスはRenameされたままである。さらにPK制約もRenameされたままであることがわかる。つまり、USER_RECYCLEBIN.CAN_UNDROP列が「YES」のものは削除前のオブジェクト名に戻るが、「NO」のものは戻らないことを示している。

さらに、参照整合性制約は削除されたままで元に戻ることはないがPK制約は有効であるので、制約違反となるレコードをInsertしようとするとORA-0001エラーが発生する。

JPOUG20160223.014

JPOUG20160223.015

インデックスやPK制約はテーブルが存在すれば、削除/再作成で元の名前に戻すことは可能であるため、Flashbck Dropの中ではRenameに関する動作が行われないのかもしれない。

今回はここまで。

Flashback Dropの検証①

Oracle10gからある地味な機能だが。。。

Flashback DropはOracle10gから登場した機能だが、正直必要性を感じることはなかった。
テーブルを間違って削除してしまうようなことは通常考えられないし、自分自身そのようなことで困ったことがなかったからだ。

ところが、過去3年間に2件ものヒューマン・エラーによるテーブルの削除事例を目にした。

いずれの事例でも幸いなことにバックアップが取得されていたので、Point-in-Timeリカバリによって最終的にはリカバリに成功したのだが、うち1件は本番環境での誤操作で、極めて莫大な損害が出たと聞いた。
他の事例も最終テスト段階での誤操作だったので、リカバリまでにテストを止めざるを得ず大きな影響を与えたらしい。

両方の事例で関係者に状況をヒアリングしたのだが、いずれも「Recyclebin」初期化パラメータはデフォルトの「on」から意図的に「off」となっており、Flashback Dropは使えない状態だった。

もし、Flashback Dropが使えていたら

もし、両方の事例で「Recyclebin」パラメータをデフォルトのままとしていたら、誤って削除してしまったテーブルを簡単な操作で、しかもほんの数秒で元に戻すことができたはずである。

一度でもFlashback Dropを体験したことのある人であればその効果が計り知れないことは容易に理解できるのであるが、残念なことにそれらでは共に使えなく、何時間もかけてバックアップから戻すはめになったのだ。

なぜRecyclebinをoffにしていたのか?

結論から言えばデフォルトのままで何ら問題はないのだが、なぜ意図的に「Recyclebin 」が「off」になっていたのかその理由を聞いてみた。

  • テーブルを削除しても「ゴミ箱」に残るということは、SYSAUXかどこかにある「ゴミ箱」領域に移動するのではないか?余計なI/Oが発生するのは嫌だ。
  • 「ゴミ箱」がいつの間にか一杯になって無駄な領域を占有するのは嫌だ。どうせ「ゴミ」なんだからさっさと消してしまいたい。
  • 新機能にはいつも泣かされてきたから、こいつもきっと悪さをするに違いない。9iまではこんな機能なかったのだから要らない。
  • 今のバージョンは11gだけど、10gの時からoffにしているからoffのまま。
  • そもそも、間違ってDropするなんてことはしないので、余計な機能は要らない。

マニュアルを熟読すれば全くの誤解であることがわかるのだが、一度誤解してしまうとベテランと言われるエンジニアほど頑ななままになる。

だから、デフォルトからわざわざ変更することになる。

検証してみた

「マニュアルにはこう書いてある。」と言っても誤解を解くのは難しいし、自分自身どのような仕組みで動いているのか知りたかったので検証してみることにした。

準備

容量管理をどのようにしているのかを確認したいので、640KBという小さな表領域を作成することにした。

環境は、Oracle 12c EE (12.1.0.2)for Windows(Non-PDB)を使用した。

CREATE TABLESPACE TS_SMALL
DATAFILE 'C:\APP\ORACLEHOME\ORADATA\ORA12C\TS_SMALL01.DBF' SIZE 640K REUSE
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K
SEGMENT SPACE MANAGEMENT AUTO;

データ作成

データはSCOTTスキーマのオブジェクトをインポートすることで簡単に作成した。

JPOUG20160223.001

JPOUG20160223.002

確認用スクリプト

stsck.sql

@@uext
@@useg
@@uind
@@ucon
@@usep
@@rbin

uext.sql

TTITLE LEFT '--- エクステント情報 ---'
col EXTENT_NAME for a32
col EXTENT_TYPE for a15
select
 SEGMENT_NAME EXTENT_NAME
,SEGMENT_TYPE EXTENT_TYPE
,TABLESPACE_NAME
,BLOCKS
from
 USER_EXTENTS
order by
 EXTENT_NAME
;
TTITLE OFF
select
 (sum(BLOCKS)+8)/80*100 "TOT_EXT%"
from USER_EXTENTS
/

useg.sql

TTITLE LEFT '--- セグメント情報 ---'
col SEGMENT_NAME for a32
col SEGMENT_TYPE for a15
select
 SEGMENT_NAME
,SEGMENT_TYPE
,TABLESPACE_NAME
,BLOCKS
from
 USER_SEGMENTS
order by
 SEGMENT_NAME
;
TTITLE OFF
select
 (sum(BLOCKS)+8)/80*100 "TOT_SEG%"
from
 USER_SEGMENTS
/

uind.sql

TTITLE LEFT '--- インデックス情報 ---'
col INDEX_NAME for a32
col TABLE_NAME for a32
select
 INDEX_NAME
,TABLE_NAME
from
 USER_INDEXES
order by
 INDEX_NAME
;
TTITLE OFF

ucon.sql

TTITLE LEFT '--- 制約情報 ---'
col CONSTRAINT_NAME for a32
col TABLE_NAME for a32
col INDEX_NAME for a32
select
 CONSTRAINT_NAME
,TABLE_NAME
,CONSTRAINT_TYPE
,INDEX_NAME
,STATUS
from
 USER_CONSTRAINTS
order by
 CONSTRAINT_NAME
;
TTITLE OFF

usep.sql

TTITLE LEFT '--- 表領域使用率 ---'
select * from DBA_TABLESPACE_USAGE_METRICS
where TABLESPACE_NAME = 'TS_SMALL'
/

rbin.sql

TTITLE LEFT '--- リサイクルビン情報 ---'
select
 OBJECT_NAME
,ORIGINAL_NAME
,OPERATION
,TYPE
,TS_NAME
,DROPSCN
,CAN_UNDROP
,CAN_PURGE
from
 USER_RECYCLEBIN
order by
 DROPSCN
/

初期状態

SQL> @stsck

--- エクステント情報 ---
EXTENT_NAME                      EXTENT_TYPE     TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_EXT%
----------
        60


--- セグメント情報 ---
SEGMENT_NAME                     SEGMENT_TYPE    TABLESPACE_NAME     BLOCKS
-------------------------------- --------------- --------------- ----------
DEPT                             TABLE           TS_SMALL                 8
EMP                              TABLE           TS_SMALL                 8
PK_DEPT                          INDEX           TS_SMALL                 8
PK_EMP                           INDEX           TS_SMALL                 8
SALGRADE                         TABLE           TS_SMALL                 8


  TOT_SEG%
----------
        60


--- インデックス情報 ---
INDEX_NAME                       TABLE_NAME
-------------------------------- --------------------------------
PK_DEPT                          DEPT
PK_EMP                           EMP


--- 制約情報 ---
CONSTRAINT_NAME                  TABLE_NAME                       CO INDEX_NAME                       STATUS
-------------------------------- -------------------------------- -- -------------------------------- ----------------
FK_DEPTNO                        EMP                              R                                   ENABLED
PK_DEPT                          DEPT                             P  PK_DEPT                          ENABLED
PK_EMP                           EMP                              P  PK_EMP                           ENABLED


--- 表領域使用率 ---
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT
--------------- ---------- --------------- ------------
TS_SMALL                48              80           60


レコードが選択されませんでした。

続く

悲惨な事故の教訓を生かせ

軽井沢スキーバス転落事故から1ヶ月

多くの若い命が失われた軽井沢スキーバス転落事故から今日で1ヶ月経った。(産経新聞)(朝日新聞)(Wikipedia

記事にもあるようにこの事故には不可解な点が多いが、運転手が死亡していることで原因究明は困難を極めている。

直接的な事故原因は制限速度50km/hのところを事故現場から250m手前の左カーブに80km/h以上でさしかかり、しかもギアがニュートラルの状態でフットブレーキのみによる減速が十分できない状態で、センターラインを右にはみ出しながら大きく蛇行し左ガードレールに接触、その反動で右側に傾きながら右ガードレールを突き破って転落というものだった。

悪者探しでは真実はわからない

このような悲惨な事故が起きると「運転手のミス」から始まって、「運行会社が悪い」「ツアー企画会社が悪い」「規制緩和した政府が悪い」のような悪者探しが始まり、しばらく盛り上がった後芸能人のニュースなどが報道されると世間の関心は下火になり、いつの間にか忘れ去られる。

ただし、それでは犠牲者たちが浮かばれない。原因不明で終わらせるのではなく、事故に至ったあらゆる可能性を検討し対策を立てる必要がある。

なぜギアがニュートラルだったのか?

ギアがエンジンブレーキが効くポジションに入っていたら、速度が過大に超過することなくカーブを曲がり切れたかもしれない。報道等にあるように事故の衝撃でギアが衝突後にニュートラルに入った可能性も否定できないが、衝突の手前からニュートラルに入っていたとすると2つの可能性が考えられる。

シフトダウンができずに運転手がパニックになった

朝日新聞の記事の図にあるように4速から3速へシフトダウンする場合、いったんクラッチを切ってからギアをニュートラルの位置を経由してギアを3速に入れる。

大型車の運転経験がないので聞いた話だが、シフトダウンの際はエンジンの回転とギア比が合っていなくて低速ギアに入りにくい場合がある。そこで、いったんニュートラルでクラッチをいったんつないで回転数を合わせた後、シフトダウンするという「ダブルクラッチ」を行うことがある。

死亡した運転手は大型バスの運転経験が浅かったため、ギアが入らないことでパニックに陥ったのかもしれない。

意図的にニュートラルにして下り坂に突っ込んだ

エンジンブレーキを効かせるとタコメータが示すエンジンの回転数が通常時より上がることがわかる。回転数が上がると素人考えではその分燃料を消費すると考えがちだが、実はエンジンブレーキ中は燃料がカットされるので結果として燃料の節約になるそうである。

運転手がそのような基本的な知識を持たず、故意にニュートラルにして燃料を節約しようとしたのであれば悲劇である。そのように示唆した先輩・同僚がもしいたとするならばその罪は大きい。

なぜ高速道路を通らなかったのか?

Wikipediaによると、事故が起きたツアーでは、会社側が運転手に対して作成する「運行指示書」にルートの記載がなく、出発地と到着地しか書かれていなかったそうである。つまり、ルートの選択は運転手の判断に任されていることが常態化しており、高速代を節約させるために運転手が一般道を選択した可能性は十分考えられる。

運転手への報酬は経費込みで支払われるため、運転手は高速代と燃料代をその中から負担していたという報道もあった。そのような構造の中では運転手が手取りを確保するために安全を犠牲にして経費を圧縮していたということは十分考えられる。

シートベルトをしていた乗客が少なかった

犠牲者のうちシートベルトの着用痕がはっきり確認できたのは一人だけだったそうで、大半は未着用だったため投げ出された衝撃で即死状態の人だったそうだ。

乗務員がシートベルトの着用を促していなかった疑いもあるが、シートベルトの着用は罰則で強制させられるようなものではなく、乗客が自発的に着用することが本質的な事故防止(軽減)策につながる。

交通従事者の所得を保障せよ

乗客の安全を直接預かる運転手が手取り額を気にして安全を後回しにするような仕組みは根本的に間違っている。深夜バスのように肉体的にも精神的にも負担の多い職業は法律で十分な給与を保障するべきだ。

経済的に余裕のない大学生が廉価なバスツアーを選択したことで悲劇に巻き込まれたのだが、簡単に命を危険にさらす可能性があるものに関してやはりある程度のコストを覚悟するような社会にならないと、このような事故は忘れたことに必ず起きるのではないか。

LCCの台頭でパイロット不足が深刻になっていて、航空会社は高給で引き止めないと必要なパイロットを確保できない状況だそうだ。

大型バス運転手にこれと同じ構図を当てはめることは難しいと思うが、二度とこのような悲劇を繰り返さないように、国は緩めた規制を戻す方向を考えた方がよい。

Oracle12c 新機能:APPROX_COUNT_DISTINCT関数

APPROX_COUNT_DISTINCT関数とは

APPROX_COUNT_DISTINCT関数とは、重複していない値の近似カウントを集計する関数で、例えば次のような問い合わせにおいて、prod_idでグループ化したうちの重複していないcust_idのカウントを集計する。

SELECT prod_id, APPROX_COUNT_DISTINCT(cust_id) AS "Number of Customers"
FROM sales
GROUP BY prod_id;
ORDER BY prod_id;

これを従来のCOUNT関数を使って書くと

SELECT prod_id, COUNT(DISTINCT cust_id) AS "Number of Customers"
FROM sales
GROUP BY prod_id;
ORDER BY prod_id;

となる。

マニュアルからの抜粋

Oracle® Database新機能ガイド
12cリリース1 (12.1)
B71327-05

には以下の記述がある。

1.2 重複していない値の近似カウント

最適化された新しいSQL関数APPROX_COUNT_DISTINCT()により、重複していない値の近似カウントが集約されます。大量のデータの処理速度が完全集約よりも大幅に上がりますが、これは特に、重複していない値が多数含まれるデータ・セットの場合に顕著であり、完全集約結果との偏差は無視できる程度です。

現在のデータ分析では、一般的な操作で重複していない値をカウントすることが求められます。処理時間およびリソース消費を桁違いに最適化すると同時にほとんど完全な結果を提供することにより、既存の処理速度を上げ、分析の洞察力を数段高めることができます。

実際に試してみた

マニュアルに書いてある「桁違いの最適化」とは一体どんなものなのか気になったので、サンプルスキーマの「SH.SALES」表(918,843件)を題材に実際に確認してみた。

以下は、COUNT関数とAPPROX_COUNT_DISTINCT関数の結果を横に並べたものである。
(前者の結果しかないように見えるが、横スクロールして後者の結果と比べてみてほしい。)

1回目にORDER BYあり、2回目にORDER BYなしの結果をそれぞれ確認した。

なお、各測定前に共有プールとバッファ・キャッシュのフラッシュを行ってから、SQL文の実行を行っている。

00001 L|SQL> SELECT prod_id, COUNT(DISTINCT cust_id) AS "Number of Customers"                                         ||00001 R|SQL> SELECT prod_id, APPROX_COUNT_DISTINCT(cust_id) AS "Number of Customers"                                  
00002  |  2  FROM sales                                                                                               ||00002  |  2  FROM sales                                                                                               
00003  |  3  GROUP BY prod_id                                                                                         ||00003  |  3  GROUP BY prod_id                                                                                         
00004  |  4  ORDER BY prod_id;                                                                                        ||00004  |  4  ORDER BY prod_id;                                                                                        
00005  |                                                                                                              ||00005  |                                                                                                              
00006  |   PROD_ID Number of Customers                                                                                ||00006  |   PROD_ID Number of Customers                                                                                
00007  |---------- -------------------                                                                                ||00007  |---------- -------------------                                                                                
00008 L|        13                2492                                                                                ||00008 R|        13                2516                                                                                
00009 L|        14                2039                                                                                ||00009 R|        14                2030                                                                                
00010 L|        15                2122                                                                                ||00010 R|        15                2105                                                                                
00011 L|        16                2384                                                                                ||00011 R|        16                2367                                                                                
00012 L|        17                2100                                                                                ||00012 R|        17                2093                                                                                
00013 L|        18                3028                                                                                ||00013 R|        18                2975                                                                                
00014 L|        19                2617                                                                                ||00014 R|        19                2630                                                                                
00015 L|        20                3795                                                                                ||00015 R|        20                3791                                                                                
00016 L|        21                2334                                                                                ||00016 R|        21                2365                                                                                
00017 L|        22                1416                                                                                ||00017 R|        22                1408                                                                                
00018 L|        23                5183                                                                                ||00018 R|        23                5104                                                                                
00019  |                                                                                                              ||00019  |                                                                                                              
00020  |   PROD_ID Number of Customers                                                                                ||00020  |   PROD_ID Number of Customers                                                                                
00021  |---------- -------------------                                                                                ||00021  |---------- -------------------                                                                                
00022 L|        24                4817                                                                                ||00022 R|        24                4754                                                                                
00023 L|        25                5068                                                                                ||00023 R|        25                4991                                                                                
00024 L|        26                4948                                                                                ||00024 R|        26                4894                                                                                
00025 L|        27                3801                                                                                ||00025 R|        27                3726                                                                                
00026 L|        28                4572                                                                                ||00026 R|        28                4537                                                                                
00027 L|        29                2295                                                                                ||00027 R|        29                2305                                                                                
00028 L|        30                6154                                                                                ||00028 R|        30                6134                                                                                
00029 L|        31                5586                                                                                ||00029 R|        31                5463                                                                                
00030 L|        32                4100                                                                                ||00030 R|        32                4025                                                                                
00031 L|        33                5389                                                                                ||00031 R|        33                5278                                                                                
00032 L|        34                4192                                                                                ||00032 R|        34                4142                                                                                
00033  |                                                                                                              ||00033  |                                                                                                              
00034  |   PROD_ID Number of Customers                                                                                ||00034  |   PROD_ID Number of Customers                                                                                
00035  |---------- -------------------                                                                                ||00035  |---------- -------------------                                                                                
00036 L|        35                4965                                                                                ||00036 R|        35                4950                                                                                
00037 L|        36                3302                                                                                ||00037 R|        36                3327                                                                                
00038 L|        37                4802                                                                                ||00038 R|        37                4735                                                                                
00039 L|        38                3395                                                                                ||00039 R|        38                3452                                                                                
00040 L|        39                3433                                                                                ||00040 R|        39                3404                                                                                
00041 L|        40                5972                                                                                ||00041 R|        40                5858                                                                                
00042 L|        41                3738                                                                                ||00042 R|        41                3759                                                                                
00043 L|        42                3951                                                                                ||00043 R|        42                3938                                                                                
00044 L|        43                3016                                                                                ||00044 R|        43                3056                                                                                
00045 L|        44                2571                                                                                ||00045 R|        44                2587                                                                                
00046 L|        45                3549                                                                                ||00046 R|        45                3499                                                                                
00047  |                                                                                                              ||00047  |                                                                                                              
00048  |   PROD_ID Number of Customers                                                                                ||00048  |   PROD_ID Number of Customers                                                                                
00049  |---------- -------------------                                                                                ||00049  |---------- -------------------                                                                                
00050 L|        46                4107                                                                                ||00050 R|        46                4054                                                                                
00051 L|        47                3198                                                                                ||00051 R|        47                3176                                                                                
00052 L|        48                6010                                                                                ||00052 R|        48                5883                                                                                
00053 L|       113                4640                                                                                ||00053 R|       113                4598                                                                                
00054 L|       114                4230                                                                                ||00054 R|       114                4183                                                                                
00055 L|       115                3847                                                                                ||00055 R|       115                3832                                                                                
00056 L|       116                4929                                                                                ||00056 R|       116                4924                                                                                
00057 L|       117                4672                                                                                ||00057 R|       117                4632                                                                                
00058 L|       118                4214                                                                                ||00058 R|       118                4200                                                                                
00059 L|       119                4898                                                                                ||00059 R|       119                4858                                                                                
00060 L|       120                5224                                                                                ||00060 R|       120                5135                                                                                
00061  |                                                                                                              ||00061  |                                                                                                              
00062  |   PROD_ID Number of Customers                                                                                ||00062  |   PROD_ID Number of Customers                                                                                
00063  |---------- -------------------                                                                                ||00063  |---------- -------------------                                                                                
00064 L|       121                3517                                                                                ||00064 R|       121                3499                                                                                
00065 L|       122                1572                                                                                ||00065 R|       122                1559                                                                                
00066 L|       123                4491                                                                                ||00066 R|       123                4441                                                                                
00067 L|       124                4309                                                                                ||00067 R|       124                4310                                                                                
00068 L|       125                4679                                                                                ||00068 R|       125                4650                                                                                
00069 L|       126                4253                                                                                ||00069 R|       126                4202                                                                                
00070 L|       127                4757                                                                                ||00070 R|       127                4710                                                                                
00071 L|       128                5196                                                                                ||00071 R|       128                5135                                                                                
00072 L|       129                2425                                                                                ||00072 R|       129                2419                                                                                
00073 L|       130                5428                                                                                ||00073 R|       130                5336                                                                                
00074 L|       131                5013                                                                                ||00074 R|       131                4907                                                                                
00075  |                                                                                                              ||00075  |                                                                                                              
00076  |   PROD_ID Number of Customers                                                                                ||00076  |   PROD_ID Number of Customers                                                                                
00077  |---------- -------------------                                                                                ||00077  |---------- -------------------                                                                                
00078 L|       132                4770                                                                                ||00078 R|       132                4688                                                                                
00079 L|       133                5201                                                                                ||00079 R|       133                5114                                                                                
00080 L|       134                3629                                                                                ||00080 R|       134                3594                                                                                
00081 L|       135                3996                                                                                ||00081 R|       135                3943                                                                                
00082 L|       136                 397                                                                                ||00082 R|       136                 395                                                                                
00083 L|       137                3993                                                                                ||00083 R|       137                3977                                                                                
00084 L|       138                2763                                                                                ||00084 R|       138                2716                                                                                
00085 L|       139                4217                                                                                ||00085 R|       139                4106                                                                                
00086 L|       140                5097                                                                                ||00086 R|       140                5032                                                                                
00087 L|       141                3546                                                                                ||00087 R|       141                3499                                                                                
00088 L|       142                3136                                                                                ||00088 R|       142                3071                                                                                
00089  |                                                                                                              ||00089  |                                                                                                              
00090  |   PROD_ID Number of Customers                                                                                ||00090  |   PROD_ID Number of Customers                                                                                
00091  |---------- -------------------                                                                                ||00091  |---------- -------------------                                                                                
00092 L|       143                2375                                                                                ||00092 R|       143                2395                                                                                
00093 L|       144                2289                                                                                ||00093 R|       144                2254                                                                                
00094 L|       145                2814                                                                                ||00094 R|       145                2807                                                                                
00095 L|       146                4796                                                                                ||00095 R|       146                4716                                                                                
00096 L|       147                3050                                                                                ||00096 R|       147                3073                                                                                
00097 L|       148                5150                                                                                ||00097 R|       148                5049                                                                                
00098  |                                                                                                              ||00098  |                                                                                                              
00099  |72行が選択されました。                                                                                        ||00099  |72行が選択されました。                                                                                        
00100  |                                                                                                              ||00100  |                                                                                                              
00101 L|経過: 00:00:01.27                                                                                             ||00101 R|経過: 00:00:00.92                                                                                             
00102  |                                                                                                              ||00102  |                                                                                                              
00103  |実行計画                                                                                                      ||00103  |実行計画                                                                                                      
00104  |----------------------------------------------------------                                                    ||00104  |----------------------------------------------------------                                                    
00105 L|Plan hash value: 932069919                                                                                    ||00105 R|Plan hash value: 4109827725                                                                                   
00106  |                                                                                                              ||00106  |                                                                                                              
00107 L|------------------------------------------------------------------------------------------------------------  ||00107 R|----------------------------------------------------------------------------------------------                
00108 L|| Id  | Operation              | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |  ||00108 R|| Id  | Operation            | Name  | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |                
00109 L|------------------------------------------------------------------------------------------------------------  ||00109 R|----------------------------------------------------------------------------------------------                
00110 L||   0 | SELECT STATEMENT       |           |    72 |  1224 |       |  2638   (2)| 00:00:01 |       |       |  ||00110 R||   0 | SELECT STATEMENT     |       |    72 |   648 |   537   (6)| 00:00:01 |       |       |                
00111 L||   1 |  SORT GROUP BY         |           |    72 |  1224 |       |  2638   (2)| 00:00:01 |       |       |  ||00111 R||   1 |  SORT GROUP BY APPROX|       |    72 |   648 |   537   (6)| 00:00:01 |       |       |                
00112 L||   2 |   VIEW                 | VM_NWVW_1 |   359K|  5966K|       |  2638   (2)| 00:00:01 |       |       |  ||00112 R||   2 |   PARTITION RANGE ALL|       |   918K|  8075K|   514   (1)| 00:00:01 |     1 |    28 |                
00113 L||   3 |    HASH GROUP BY       |           |   359K|  3158K|    17M|  2638   (2)| 00:00:01 |       |       |  ||00113 R||   3 |    TABLE ACCESS FULL | SALES |   918K|  8075K|   514   (1)| 00:00:01 |     1 |    28 |                
00114 L||   4 |     PARTITION RANGE ALL|           |   918K|  8075K|       |   514   (1)| 00:00:01 |     1 |    28 |  ||00114 R|----------------------------------------------------------------------------------------------                
00115 L||   5 |      TABLE ACCESS FULL | SALES     |   918K|  8075K|       |   514   (1)| 00:00:01 |     1 |    28 |  ||       |                                                                                                              
00116 L|------------------------------------------------------------------------------------------------------------  ||       |                                                                                                              
00117  |                                                                                                              ||00115  |                                                                                                              
00118  |                                                                                                              ||00116  |                                                                                                              
00119  |統計                                                                                                          ||00117  |統計                                                                                                          
00120  |----------------------------------------------------------                                                    ||00118  |----------------------------------------------------------                                                    
00121 L|       1936  recursive calls                                                                                  ||00119 R|       1956  recursive calls                                                                                  
00122  |          0  db block gets                                                                                    ||00120  |          0  db block gets                                                                                    
00123 L|       4914  consistent gets                                                                                  ||00121 R|       4921  consistent gets                                                                                  
00124 L|       1772  physical reads                                                                                   ||00122 R|       1729  physical reads                                                                                   
00125  |          0  redo size                                                                                        ||00123  |          0  redo size                                                                                        
00126 L|       2133  bytes sent via SQL*Net to client                                                                 ||00124 R|       2134  bytes sent via SQL*Net to client                                                                 
00127  |        595  bytes received via SQL*Net from client                                                           ||00125  |        595  bytes received via SQL*Net from client                                                           
00128  |          6  SQL*Net roundtrips to/from client                                                                ||00126  |          6  SQL*Net roundtrips to/from client                                                                
00129  |        136  sorts (memory)                                                                                   ||00127  |        136  sorts (memory)                                                                                   
00130  |          0  sorts (disk)                                                                                     ||00128  |          0  sorts (disk)                                                                                     
00131  |         72  rows processed                                                                                   ||00129  |         72  rows processed                                                                                   
00132  |                                                                                                              ||00130  |                                                                                                              
00133  |                                                                                                              ||00131  |                                                                                                              
00134 L|SQL> SELECT prod_id, COUNT(DISTINCT cust_id) AS "Number of Customers"                                         ||00132 R|SQL> SELECT prod_id, APPROX_COUNT_DISTINCT(cust_id) AS "Number of Customers"                                  
00135  |  2  FROM sales                                                                                               ||00133  |  2  FROM sales                                                                                               
00136  |  3  GROUP BY prod_id;                                                                                        ||00134  |  3  GROUP BY prod_id;                                                                                        
00137  |                                                                                                              ||00135  |                                                                                                              
00138  |   PROD_ID Number of Customers                                                                                ||00136  |   PROD_ID Number of Customers                                                                                
00139  |---------- -------------------                                                                                ||00137  |---------- -------------------                                                                                
00140 L|        22                1416                                                                                ||00138 R|        22                1408                                                                                
00141 L|        25                5068                                                                                ||00139 R|        25                4991                                                                                
00142 L|        30                6154                                                                                ||00140 R|        30                6134                                                                                
00143 L|        34                4192                                                                                ||00141 R|        34                4142                                                                                
00144 L|        42                3951                                                                                ||00142 R|        42                3938                                                                                
00145 L|        43                3016                                                                                ||00143 R|        43                3056                                                                                
00146 L|       123                4491                                                                                ||00144 R|       123                4441                                                                                
00147 L|       129                2425                                                                                ||00145 R|       129                2419                                                                                
00148 L|       138                2763                                                                                ||00146 R|       138                2716                                                                                
00149 L|        13                2492                                                                                ||00147 R|        13                2516                                                                                
00150 L|        28                4572                                                                                ||00148 R|        28                4537                                                                                
00151  |                                                                                                              ||00149  |                                                                                                              
00152  |   PROD_ID Number of Customers                                                                                ||00150  |   PROD_ID Number of Customers                                                                                
00153  |---------- -------------------                                                                                ||00151  |---------- -------------------                                                                                
00154 L|        29                2295                                                                                ||00152 R|        29                2305                                                                                
00155 L|        44                2571                                                                                ||00153 R|        44                2587                                                                                
00156 L|        47                3198                                                                                ||00154 R|        47                3176                                                                                
00157 L|       113                4640                                                                                ||00155 R|       113                4598                                                                                
00158 L|       116                4929                                                                                ||00156 R|       116                4924                                                                                
00159 L|       120                5224                                                                                ||00157 R|       120                5135                                                                                
00160 L|       128                5196                                                                                ||00158 R|       128                5135                                                                                
00161 L|       147                3050                                                                                ||00159 R|       147                3073                                                                                
00162 L|       121                3517                                                                                ||00160 R|       121                3499                                                                                
00163 L|       134                3629                                                                                ||00161 R|       134                3594                                                                                
00164 L|       144                2289                                                                                ||00162 R|       144                2254                                                                                
00165  |                                                                                                              ||00163  |                                                                                                              
00166  |   PROD_ID Number of Customers                                                                                ||00164  |   PROD_ID Number of Customers                                                                                
00167  |---------- -------------------                                                                                ||00165  |---------- -------------------                                                                                
00168 L|        14                2039                                                                                ||00166 R|        14                2030                                                                                
00169 L|        20                3795                                                                                ||00167 R|        20                3791                                                                                
00170 L|        21                2334                                                                                ||00168 R|        21                2365                                                                                
00171 L|        26                4948                                                                                ||00169 R|        26                4894                                                                                
00172 L|        31                5586                                                                                ||00170 R|        31                5463                                                                                
00173 L|       132                4770                                                                                ||00171 R|       132                4688                                                                                
00174 L|       148                5150                                                                                ||00172 R|       148                5049                                                                                
00175 L|       141                3546                                                                                ||00173 R|       141                3499                                                                                
00176 L|        24                4817                                                                                ||00174 R|        24                4754                                                                                
00177 L|        32                4100                                                                                ||00175 R|        32                4025                                                                                
00178 L|        46                4107                                                                                ||00176 R|        46                4054                                                                                
00179  |                                                                                                              ||00177  |                                                                                                              
00180  |   PROD_ID Number of Customers                                                                                ||00178  |   PROD_ID Number of Customers                                                                                
00181  |---------- -------------------                                                                                ||00179  |---------- -------------------                                                                                
00182 L|       117                4672                                                                                ||00180 R|       117                4632                                                                                
00183 L|       119                4898                                                                                ||00181 R|       119                4858                                                                                
00184 L|       133                5201                                                                                ||00182 R|       133                5114                                                                                
00185 L|       137                3993                                                                                ||00183 R|       137                3977                                                                                
00186 L|       143                2375                                                                                ||00184 R|       143                2395                                                                                
00187 L|        17                2100                                                                                ||00185 R|        17                2093                                                                                
00188 L|        23                5183                                                                                ||00186 R|        23                5104                                                                                
00189 L|        35                4965                                                                                ||00187 R|        35                4950                                                                                
00190 L|        37                4802                                                                                ||00188 R|        37                4735                                                                                
00191 L|        38                3395                                                                                ||00189 R|        38                3452                                                                                
00192 L|        48                6010                                                                                ||00190 R|        48                5883                                                                                
00193  |                                                                                                              ||00191  |                                                                                                              
00194  |   PROD_ID Number of Customers                                                                                ||00192  |   PROD_ID Number of Customers                                                                                
00195  |---------- -------------------                                                                                ||00193  |---------- -------------------                                                                                
00196 L|       125                4679                                                                                ||00194 R|       125                4650                                                                                
00197 L|       135                3996                                                                                ||00195 R|       135                3943                                                                                
00198 L|        33                5389                                                                                ||00196 R|        33                5278                                                                                
00199 L|        40                5972                                                                                ||00197 R|        40                5858                                                                                
00200 L|        41                3738                                                                                ||00198 R|        41                3759                                                                                
00201 L|        45                3549                                                                                ||00199 R|        45                3499                                                                                
00202 L|       114                4230                                                                                ||00200 R|       114                4183                                                                                
00203 L|       130                5428                                                                                ||00201 R|       130                5336                                                                                
00204 L|       131                5013                                                                                ||00202 R|       131                4907                                                                                
00205 L|       136                 397                                                                                ||00203 R|       136                 395                                                                                
00206 L|       140                5097                                                                                ||00204 R|       140                5032                                                                                
00207  |                                                                                                              ||00205  |                                                                                                              
00208  |   PROD_ID Number of Customers                                                                                ||00206  |   PROD_ID Number of Customers                                                                                
00209  |---------- -------------------                                                                                ||00207  |---------- -------------------                                                                                
00210 L|        18                3028                                                                                ||00208 R|        18                2975                                                                                
00211 L|        27                3801                                                                                ||00209 R|        27                3726                                                                                
00212 L|        36                3302                                                                                ||00210 R|        36                3327                                                                                
00213 L|       115                3847                                                                                ||00211 R|       115                3832                                                                                
00214 L|       146                4796                                                                                ||00212 R|       146                4716                                                                                
00215 L|       124                4309                                                                                ||00213 R|       124                4310                                                                                
00216 L|       142                3136                                                                                ||00214 R|       142                3071                                                                                
00217 L|       145                2814                                                                                ||00215 R|       145                2807                                                                                
00218 L|        15                2122                                                                                ||00216 R|        15                2105                                                                                
00219 L|        19                2617                                                                                ||00217 R|        19                2630                                                                                
00220 L|        39                3433                                                                                ||00218 R|        39                3404                                                                                
00221  |                                                                                                              ||00219  |                                                                                                              
00222  |   PROD_ID Number of Customers                                                                                ||00220  |   PROD_ID Number of Customers                                                                                
00223  |---------- -------------------                                                                                ||00221  |---------- -------------------                                                                                
00224 L|       118                4214                                                                                ||00222 R|       118                4200                                                                                
00225 L|       126                4253                                                                                ||00223 R|       126                4202                                                                                
00226 L|       127                4757                                                                                ||00224 R|       127                4710                                                                                
00227 L|        16                2384                                                                                ||00225 R|        16                2367                                                                                
00228 L|       122                1572                                                                                ||00226 R|       122                1559                                                                                
00229 L|       139                4217                                                                                ||00227 R|       139                4106                                                                                
00230  |                                                                                                              ||00228  |                                                                                                              
00231  |72行が選択されました。                                                                                        ||00229  |72行が選択されました。                                                                                        
00232  |                                                                                                              ||00230  |                                                                                                              
00233 L|経過: 00:00:00.90                                                                                             ||00231 R|経過: 00:00:00.73                                                                                             
00234  |                                                                                                              ||00232  |                                                                                                              
00235  |実行計画                                                                                                      ||00233  |実行計画                                                                                                      
00236  |----------------------------------------------------------                                                    ||00234  |----------------------------------------------------------                                                    
00237 L|Plan hash value: 2475333094                                                                                   ||00235 R|Plan hash value: 3604305554                                                                                   
00238  |                                                                                                              ||00236  |                                                                                                              
00239 L|------------------------------------------------------------------------------------------------------------  ||00237 R|----------------------------------------------------------------------------------------------                
00240 L|| Id  | Operation              | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |  ||00238 R|| Id  | Operation            | Name  | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |                
00241 L|------------------------------------------------------------------------------------------------------------  ||00239 R|----------------------------------------------------------------------------------------------                
00242 L||   0 | SELECT STATEMENT       |           |    72 |  1224 |       |  2638   (2)| 00:00:01 |       |       |  ||00240 R||   0 | SELECT STATEMENT     |       |    72 |   648 |   537   (6)| 00:00:01 |       |       |                
00243 L||   1 |  HASH GROUP BY         |           |    72 |  1224 |       |  2638   (2)| 00:00:01 |       |       |  ||00241 R||   1 |  HASH GROUP BY APPROX|       |    72 |   648 |   537   (6)| 00:00:01 |       |       |                
00244 L||   2 |   VIEW                 | VM_NWVW_1 |   359K|  5966K|       |  2638   (2)| 00:00:01 |       |       |  ||00242 R||   2 |   PARTITION RANGE ALL|       |   918K|  8075K|   514   (1)| 00:00:01 |     1 |    28 |                
00245 L||   3 |    HASH GROUP BY       |           |   359K|  3158K|    17M|  2638   (2)| 00:00:01 |       |       |  ||00243 R||   3 |    TABLE ACCESS FULL | SALES |   918K|  8075K|   514   (1)| 00:00:01 |     1 |    28 |                
00246 L||   4 |     PARTITION RANGE ALL|           |   918K|  8075K|       |   514   (1)| 00:00:01 |     1 |    28 |  ||00244 R|----------------------------------------------------------------------------------------------                
00247 L||   5 |      TABLE ACCESS FULL | SALES     |   918K|  8075K|       |   514   (1)| 00:00:01 |     1 |    28 |  ||       |                                                                                                              
00248 L|------------------------------------------------------------------------------------------------------------  ||       |                                                                                                              
00249  |                                                                                                              ||00245  |                                                                                                              
00250  |                                                                                                              ||00246  |                                                                                                              
00251  |統計                                                                                                          ||00247  |統計                                                                                                          
00252  |----------------------------------------------------------                                                    ||00248  |----------------------------------------------------------                                                    
00253 L|       2432  recursive calls                                                                                  ||00249 R|       2313  recursive calls                                                                                  
00254  |          0  db block gets                                                                                    ||00250  |          0  db block gets                                                                                    
00255 L|       5669  consistent gets                                                                                  ||00251 R|       5458  consistent gets                                                                                  
00256 L|       1794  physical reads                                                                                   ||00252 R|       1765  physical reads                                                                                   
00257  |          0  redo size                                                                                        ||00253  |          0  redo size                                                                                        
00258 L|       2133  bytes sent via SQL*Net to client                                                                 ||00254 R|       2134  bytes sent via SQL*Net to client                                                                 
00259  |        595  bytes received via SQL*Net from client                                                           ||00255  |        595  bytes received via SQL*Net from client                                                           
00260  |          6  SQL*Net roundtrips to/from client                                                                ||00256  |          6  SQL*Net roundtrips to/from client                                                                
00261 L|        239  sorts (memory)                                                                                   ||00257 R|        229  sorts (memory)                                                                                   
00262  |          0  sorts (disk)                                                                                     ||00258  |          0  sorts (disk)                                                                                     
00263  |         72  rows processed                                                                                   ||00259  |         72  rows processed                                                                                   
00264 L|                                                                                                              ||       |                                                                                                              

何が違うのか?

行番号の後に「L」あるいは「R」がついている行は、左右の結果が異なるものを示している。

近似値というからには両者はほとんど同じ結果でたまに違う値となることを予想していたのだが、あにはからんや(72行という結果は同じだが)すべての行で異なるカウント値となった。

また、統計情報はほとんど同じだが、実行計画が大きく異なっている。

COUNT関数の場合「PARTITION RANGE ALL」で全行を取得した後、「HASH GROUP BY」で約35万9千行のビユーを作成(その際17MBのHASH AREAを使用)し、さらに「SORT GROUP BY」で72行に絞り込んでいる。

一方、APPROX_COUNT_DISTINCT関数の場合全行を取得するまでは同じだが、「SORT GROUP BY APPROX」という新たなオペレーションによって一気に72行まで絞り込んでいる。その際コストの上積み分もほとんどない。(514→538)

今回の場合、テーブルサイズがそれほど大きくないので、実行時間で大きな違いはなかったが、巨大なテーブルの場合は「HASH GROUP BY」オペレーションの負荷が甚大になることが予想されるので、両者の違いが顕著になるかもしれない。

正確なカウントは必要なのか?

検索条件を入力して「◯件ヒットしました。」と表示させるアプリケーションは多いが、その値の正確性を1桁単位で求めてもあまり意味のないことが多い。

チューニングの現場ではCOUNT関数の負荷が問題となっていることが多いので、このAPPROX_COUNT_DISTINCT関数は意外と使えるかもしれない。

 

八王子まで往復

冬用ジャケットを買った

寒くなってから自転車に乗る機会がぐっと減った。理由は寒いからだ。11月までは月300km以上乗っていたのだが12月になると59 km、1月は88kmと少なくなっている。

寒い日はローラー台をこいだりもしていたのだが、これではいけないと昨日三井アウトレットパーク入間にあるY’s Roadで、パールイズミのウインドブレークジャケットと冬用タイツ、そして同じアウトレット内のアンダーアーマーでコールドギア(防寒用インナー)を買った。

まとめて買うとちょっといい値段(3万円弱)だが、さすがアウトレットAmazonで買うよりもかなり安かった。

目的地は八王子駅

自宅から往復で100kmくらいのところということで目的地を八王子駅に決めた。

八王子ー藤沢

藤沢から八王子はかなり遠いイメージだったが、こうして地図で見てみると八王子まではほぼ一直線に見える。藤沢から海老名、座間、橋本を通って八王子までのコースだ。

往きはなだらかな上りで橋本から八王子の間は丘越えがきつくなるところもあったが、帰りは逆に海に向かって軽い下りが続くので後半それほどきつくないコースだ。

冬用ジャケットは強力!

パールイズミの冬用ジャケットは体感温度の目安で防寒性能の違いを表している。今回買ったのは「5℃」というもので、当日の気温もほぼ同じくらいだったのだが寒すぎず暑すぎずでちょうどよかった。なんでもっと早く買わなかったのかと後悔した。

八王子駅に到着

八王子駅

途中、八王子に住んでいる航空自衛隊時代の先輩のNさんに電話してちょっと顔を出そうかと思ったのだが、あいにく少し遠くへ出かけているとのことでそのまま八王子駅へ。

駅の近くにある有料の駐輪場へ自転車を止めお昼に。駐輪場は半日止めても100円なので短時間だともったいないが、ちゃんとロックがかかるので一人で行動する場合の防犯としてはよいのだ。

お昼は炒飯

チャーハン

昼食は駅近くの炒飯専門店で炒飯(880円)を食べる。メニューの一番上に書いてあった豚バラ肉が乗ったのを注文したが、普通の方がよかったかもしれない。

どこを走っているかがわかることとは

自分がどの辺りを走っているのかは地図や標識でわかるのだが、今回新たな気づきがあった。

自転車で走っていると選挙ポスターがやたら目につく。今回3つか4つの選挙区を横断したのだが、選挙区が変わるとポスターもがらっと変わって面白い。

座間市に入ると甘利明のポスターがいきなり目立ってくる。すました顔で「経済で結果を出す。」みたいなキャッチフレーズが書いてあったが、結果を出す前に大臣やめちゃったねと甘利明の白髪が余計に白く感じた。

 

なぜ日本は子供の貧困が深刻なのか

最近の朝生にはがっかりさせられることが多いが。。。

テレビ朝日の「朝まで生テレビ」はスタート当初から好きで、竹下内閣が消費税3%を導入した直後に一度スタジオで観覧したこともある。

昨年末の12月31日に放送された回ではヤラセが発覚したり、田原総一朗が自分と異なる意見を途中でさえぎったりと、最近の朝生はどうもフラストレーションが溜まってばかりだったのだが、2月5日深夜(6日早朝)の放送「激論!女性論客大集合 “女性が輝く社会”とは?!」はなかなか面白かった。

子供の貧困は深刻

荻原博子の発言がきっかけでシングルマザーの貧困の話題になったのだが、嘉田由紀子の意見はなかなか聞き応えがあった。

アベノミクスでかなり儲けた人がいる反面、以下のような貧困状態は深刻化が進み格差が開く一方である。

  • 子供の約6人に1人が貧困
  • 母子家庭の平均年収223万円
  • ひとり親現役世代の貧困率54.6%

貧困の最大の原因とは

これに対して、嘉田由紀子他のパネラーの意見は次のようなものだった。

  • 日本では離婚後の親権が片親のみに属することが最大の問題。
  • 明治民法では「女の腹は借り物」とみなされ女性は親権を持つことができなかった。
  • つまり、家の跡取りとして男性のみが親権を持っていた。
  • 現代においては明治民法の「単一親権」という部分が残り、結果として離婚後に母親が(子供のために)親権を取らざるを得ず男性が逃げるという構図になっている。
  • 離婚後養育費を払っている男性は2〜3割しかなく、残りは経済的な負担から逃げている。
  • (恐らく)欧米においては、離婚後も両親親権が維持されているので法律的に男性には養育費の支払い義務がある。
  • 離婚の内訳として協議離婚が9割を占めているということも養育費の支払いを拒否する(つまり両者が納得した上での離婚であるとの理由)男性が多く、法律的にも強制することができない。
  • 調停離婚であれば家裁が養育費の取り立てに応じることもあるが全体からすればごくわずか。
  • 離婚原因の多くは男性のDVであるので、女性側からなかなか養育費の支払いを求めることができない。

今すぐ法律を変えろ!

番組には、片山さつき、辻元清美といった国会議員も参加していたが、国会議員は週明けから「両親親権」にするために働くべきだ。

こんな重大なことを放置しておいて、何が「女性が輝く社会」だ。「一億総活躍社会」だ。

国会議員は真面目に仕事しろと言いたい。

Amazon RDSをさわって考えた

やっと再開

新しい年になってもなかなかブログが捗らなかったが、今年から「ですます調」から「である調」に変えて再開することにした。

Amazon RDSを使ってみた

今までクラウドでデータベースを使うということに性能面でどうしても違和感を持っていたので、あまり積極的に関心を寄せなかったのだが、仕事の関係でPostgreSQL on RDSを使う機会があったので、個人的にも無料の範囲で試してみることにした。Amazon RDS

詳しい構築手順等は検索すればいろいろ見つかるので割愛するが、ゆっくり確認しながらでも30分程度でDBインスタンスが構築できてしまうのは驚異的である。

インスタンス作成中

RDSとOSS

当然のことながらRDSとOSSは相性がいい。ライセンス費用が発生しないからだ。一方商用製品であるOracleとMSSQLはライセンス費用を考慮する必要がある。

例えばOracle Enterprise EditionをRDSで使用する場合は、自前のライセンスを用意する必要がある。

バックアップ

RDSではバックアップウィンドウを指定するだけで勝手にバックアップを取得してくれる。万一バックアップからリカバリする場合は、今までのインスタンスとは別にインスタンスを作成しそちらにリカバリするなど多少運用を考える必要があるが、フルマネージドRDBサービスとしての重要な機能のうちの1つであるであることに間違いはない。

監視

AWSで提供されるCloudwatchによって、パフォーマンスデータの取得及び可視化(グラフ化)が可能である。

監視項目(メトリック)の数も充実している。

冗長構成

無料お試し版では使えないが、マルチAZ配置とすれば異なるアベイラビリティ・ゾーン間で「プライマリ」と「スタンバイ」レプリカの構成を自動的に構成・管理することができる。

「プライマリ」側に何らかの異常があった場合でも「スタンバイ」へ自動的に切り替えることで運用を継続することができる。

Oracleの世界で言うところのData Guardのような仕様で冗長性を担保する。

Oracle RACのサポートについて

将来サポートされるかどうかは不明だが、現在RDSではOracle RACはサポートされていない。

これは技術的なハードルというよりもむしろRDSの冗長性に対する考え方によるものなのかもしれない。

Oracle RACのようなActive-Active構成を実現するためには、複数ノードから同時アクセス可能なASMのような仕組みを実装必要があるが、「1つのインスタンスは1つのノードでしか動かさない」という割り切りをすれば、そのような仕組みは不要でありより一般的なファイルシステムを使用することができる。

また、Oracle RACにおいてはノード間通信であるキャッシュフュージョンが発生すると性能が劣化することはよく知られている。

だからノードを増やすスケールアウトで性能を担保するというのは実は難しく、マシンスペックを上げて対応するスケールアップで性能を担保する方が設計上は確実であるという考えにRDSは至ったのかもしれない。

どこまでユーザに変更を許すか

RDSはSSHによりOS領域にログインすることはできない仕様となっている。従ってユーザができることは限られており、逆にユーザの不適切なオペレーションによる環境破壊等を防止する仕組みであると考えても良いのかもしれない。

パラメータもマシンスペック(インスタンスクラス)に応じてチューニングされたものが自動的に設定されるため、ユーザは基本的にパラメータを変更する必要はない。

どうしてもデフォルトパラメータから変更したい場合は、パラメータグループを作成して反映させるようになっている。

考えてみれば、パラメータはデフォルトのまま運用するべきではないと言っていたのは昔の話で、例えばOracleではパラメータの自動チューニングが進化しているので、パラメータを変更してチューニングするという機会はどんどん減っている。

Amazon RDSは使えるか

クラウド環境に大切なデータを預けるのは如何なものか的な考え方は未だに根強いが、十分なコストメリットとセキュリティの妥当性を実感できればRDSのような環境を業務に活用するという流れは加速されるだろう。

私が漠然と持っていた性能面に関する懸念も杞憂に終わるのではないかとさえ思えるほど、RDSの内容と選択の多様性は充実している。

 

書籍紹介:イギリス人アナリストだからわかった日本の「強み」「弱み」 (講談社+α新書)

8199+gpS69L._SL1500_

著者は異色の経営者

著者はイギリス人の証券アナリストとして、バブル崩壊後の日本において不良債権処理に関する鋭い指摘で名を馳せましたが、2009年にゴールドマン・サックス証券を最後にアナリストを引退、その後は文化財などの修理、施工を行っている「小西美術工藝社」という社長から猛烈なアプローチを受け経営を託されているという異色の経営者です。

テレビ東京のカンブリア宮殿で紹介されたこともありますが、以前からこの方には興味を持っていたので、Kindleでを買って読んでみました。

Kindleのハイライトは便利だけど。。。

親日家のイギリス人が、日本人をヨイショしている本かと思いきや、タイトルにもあるように日本人の「弱み」を鋭く指摘しているところが非常に的確で、グイグイ引き込まれてしまい1時間半くらいで一気に読んでしまいました。

Kindleはハイライトを後でまとめて見返すことができる便利な機能があるので、私の印象に残ったところを紹介したいと思います。(最近なるべく後から思い出しやすいように、ハイライトさせる箇所を少し広めにしています。このように紹介することが著作権にどのように関わるかちょっとグレーな感じがしますが、これを読んで本を買いたい気持ちになればそれもありなので、そのまま紹介します。)

私のハイライト紹介


ただ、これらの動きのなかで、ひとつだけ気になることがあります。  それは海外の文化や風習などと日本の文化や風習を比較した後で、結局はランキング、すなわち、優劣をつけて「やっぱり日本はすごい」と自画自賛するという結論になっていることが非常に多い印象なのです。  特にテレビは、視聴者を良い気分にさせなければいけないからでしょうが、あまりにもこの予定調和が多いのです

読書位置29


このような結論にもっていくという手法は、私のようなイギリス人にはあまりにも無理があるというか、かなり抵抗があります。  なぜかと言いますと、こうした番組は日本の強みの検証ではなく、日本が強くかつ相手国が弱い特徴だけを取り上げて優劣を競うという、結論ありきで、フェアではないことが多い印象だからです。  海外において、自分たちの国の強みと弱みをテーマにした本を探しましたが、あまり確認できませんでした。なぜこのような類の本がないのでしょうか。  これはあくまで私の想像ですが、まず強み弱みをテーマにした本をつくるのは大変だということがあるかもしれません。たとえば、イギリスが国の強み弱みの本を出そうと思ったら徹底的にデータや事例を並べて、一時的な強み弱みなのかどうか、因果関係があるのかどうかという分析などで、すさまじいページ数を費やしてしまうでしょう。  次に考えられるのは単純に興味がないということです。多くの国の国民は、他国からどう思われているのかにあまり興味がありません。それが分かったからといって、それは他国と比較したものである以上、その他国に住んでいるわけではないので、あまり意味がないと考えているのです。  国際比較をするときに、そもそも、どこの国の何を比べて、誰が何をもってどういう価値観で強み弱みを決めるか、ということをめぐってかなり激しい議論が交わされることが予想されます。そういう意味でも海外では自国の「強み弱み」を論じるというのは非常に難解なテーマなのです

読書位置40


ひとつは、一九九〇年代以降の「ポリティカルコレクトネス(political correctness 以下、PC)」の流行があります。PCとは、人種の別、性別などによる差別廃止の立場での政治的正当性を訴える運動のことです

読書位置63


実際に、比較する側とされる側の両方がいるなかで、国際比較はどんなに難しいのかということが明確に浮き彫りになってきました。要するに、PCに対して批判的な人は、PCによって何も言えなくなってしまったというわけです。自国への礼賛というのは他国への侮辱と表裏一体だからでしょう。

読書位置75


申し遅れましたが、私の名はデービッド・アトキンソン。イギリスの中東部の小さな町で生まれました。父親はエンジニア・重機の会社の経営者として、大英帝国時代の名残りもあって、仕事で世界各国に出張していました。そのような家庭の四人兄弟の三男として生まれた私は、アイザック・ニュートンが通った地元の高校を卒業した後、オックスフォード大学にて、戦後経済の発展を専攻に、日本学を学びました。  卒業後は、日本の金融機関をお客様にして、ニューヨークでコンサルティングをした後に、一九九〇年からはソロモン・ブラザーズ証券のアナリストになり、バブル崩壊後の不良債権問題などを指摘させていただきました。  その後、ゴールドマン・サックス証券に移籍をし、二〇〇九年に引退。趣味であるお茶を楽しむなどの生活を送っていたのですが、二〇〇九年にひょんなことから「小西美術工藝社」という会社の社長から熱烈なアプローチを受けて、経営を任せられることになりました

読書位置88


アナリストがなぜ客観的分析をこころがけるかというと、企業や経営の姿を正しく把握しなければ、何がいけないのか、何が問題なのかという事実がわからなくなってしまうからです。事実を直視すれば、おのずと何をすべきかという解決策が見えてきますが、事実から目を背けて、自分たちに都合の良い分析に固執していると、良くない結果を招きます。それは先ほどの不良債権問題でも明らかではないでしょうか

読書位置103


私から見ると、日本ははっきり言ってしまうと「宝の持ち腐れ」という印象です。  力はあるもののその本来の力を引き出すことなく、それほど力のないポイントを、アンフェアな分析で強引に力があると思い込んでいる。  つまり、自分たちが本来もっている力を見誤っているのです。これが日本という国と、みなさん日本人にとって大きな損失であることは言うまでもありません

読書位置121


本書で最も申し上げたいのは、日本にはまだまだ日本のみなさんが気づいていない「強み」がある、という事実であり、それを活かしきれていないことこそ最大の「弱み」だということです

読書位置141


不良債権問題の時、私は日本の銀行の「弱み」について客観的分析をして、それをレポートなどで指摘をしました。自分としてはその「弱み」をどのように解決していけば成長できるというところまで提言をしたつもりでしたが、残念ながらあの時は耳を貸していただけませんでした

読書位置144


日本と比較した場合、中国の人口は日本の一〇倍強なので、一人当たりのGDPが日本の一〇分の一になるだけで、中国経済が日本経済の絶対額を抜きます。  ただ、それは総額だけの話です。一人当たりのGDPは中国は世界八〇位にすぎないので、客観的に見れば、まだ先進国ではありません。

読書位置241


一億人の人口を超えている一二ヵ国の中で、先進国になっているのは二ヵ国のみです。それは、アメリカと日本だけです。人口が非常に多くて、なおかつインフラ整備され、教育水準も高く、技術力なども揃っている人口大国は、この二つしかありません。

読書位置254


誰もがうなずく話ですが、やはり先進国の中で日本のエンジニアは別格です。これまでの経済史を振り返っても、商品開発などの功績において多くの足跡を残しています。  この原動力になっているものには、やはり「職人魂」と言いますか、「極める美学」があると思います。海外赴任をしても、祭日祝日でも休むことなく、徹底的に自分の技術を磨く日本のエンジニアの働きぶりは世界の誰もに認められていますし、日本社会でも尊敬の対象になっています。海外のエンジニアが何回も試したけれどできなかったことが、日本人エンジニアによってなしとげられたというケースは少なくありません。

読書位置272


ここで私が言いたいのは、日本人労働者は勤勉で技術力が高いというのはまぎれもない事実であり、日本の強みでもありますが、それを実態以上に評価するのは間違いだということなのです。

読書位置303


日本が経済大国になったのは、戦後の奇跡の経済成長があったからだという主張は、明治から大正にかけて日本を先進国に押し上げた先人たちをあまりにも軽んじているのではないかと、私などは感じてしまうのです。

読書位置350


そのような「弱み」として、私がまず申し上げたいのは、日本の効率性と生産性の低さです。  これは私だけではなく、日本人でも多くの方たちが指摘をしていることです。

読書位置410


日本人は非常に勤勉であり、労働者もよく働くというのは紛れもない事実であり、明らかに価値の有無が問われる仕事までも非常にまじめにこなします。  ただ、一方で柔軟性に欠けている、つまり頭が固い傾向があります。本当はずっと前に止めたほうが良いとだれもが気づいている仕事の仕方は改善をしないで、それに対しても、むしろ美徳を見出そうとする傾向がある印象さえ受けます。

読書位置468


長時間労働もこれと同じです。日本人は非常によく働きますが、Euroslarによりますと、一時間当たりのGDPは二〇一三年で世界二一位。やはり長く働けば働くほど、疲れるので効率が下がるのではないでしょうか。

読書位置482


つまり、文化財修理に力を入れるということは、内外からの観光客を呼ぶ一助になるだけではなく、国の雇用対策にとっても非常に良い投資先であるといえます。

読書位置555


会社というものが組織の生産性を上げるのに、経営者が及ぼす影響というのは極めて大きいということを申し上げたいのです。  つまり、日本の「効率性が良くない」という問題は辿っていくと、じつは日本の経営者につきあたるのではないかということです。

読書位置602


日本の仕事の進め方があまり「効率が良くない」というのは、一人ひとりの日本人労働者やビジネスマンたちに原因があるのではなく、経営者などのリーダーにある可能性が極めて高いのです。

読書位置620


アメリカとイギリスでは、労働者は日本のように優れてはないので、それでも国が成り立つようにするために、かえって経営者が鍛えられて、強くなるのだと思います。  逆に、日本は労働者の質が良くて、おまけに今まで高度成長の環境にも恵まれてきたので、経営者が鍛えられず、海外の一部に比べて、弱いように見えてしまうと思います。

読書位置646


日本の経営者はプロセスに重きを置く傾向があります。そして、この傾向が舵取りをする組織に波及し、そこで働く従業員たちに波及し、その結果、仕事の進め方の効率が悪くなっている可能性があるのです。さらに言わせていただきたいのは、「やや行き過ぎではないか」ということです。

読書位置685


コンサルタントをやっている時代に、研修で、商品を九〇パーセントまで仕上げるには一〇のコストがかかるとしたら、一〇〇パーセントにもっていくには、そこからは一パーセントを上げるたびに、さらに九ずつのコストがかかるというのが鉄則だと教わりました。

読書位置717


日本人の一部は仕事を美徳と見なしたり、修行と見なしたり、本来は別な場所で求める夢を仕事に持ち込み過ぎている感じがありまして、それが一人当たりGDPの数字の伸び悩みとして表面化しているのではないかとの仮説を、私は立てています。

読書位置722


先進国のなかでも比較的恵まれている経済のなか、日本の経営者が「数字」に基づいた経営、さらには今までよりも株価を重視した経営へと切り替えれば、今まで以上に素晴らしい経済になる可能性を秘めています。

読書位置768


日本の「効率が良くない」というものの問題を辿っていくと、かなりの部分はこの「面倒くさい」という言葉に帰結する感じがします。

読書位置853


経済という数字については、これを直せばすぐに改善するというようなシンプルアンサーでは、なかなか解決ができません。しかし、何が悪い、どこが劣っているという問題点というのは、その本質は非常にシンプルなのです。難しい言葉や表現をつかって粉飾をしても、「結局、何を言いたいのですか」という質問を繰り返していくことで、問題に対する本当の原因が見えてきます。

読書位置856


イギリスでは「too much trouble」という概念はありますが、それは問題を解決しない理由として今はなかなか認められません。 「troublesome」を解決することが「仕事」なわけですから、「面倒くさいことになるのでやめたほうがいい」というような結論にはなかなかなりません。昔はそうではなかったかもしれませんが、とくにイギリスでは「面倒」なことを解決することがGDPの成長につながるという考え方に変わっていきました。

読書位置873


日本社会では「正論」を潰すことが多々ある。その際につかわれる便利な言葉が「面倒くさいことになる」なのではないかということです。

読書位置906


戦後日本の経済成長は「奇跡」と言うよりは、ある意味で成功がかなり約束されたものだったのです。  このように黙っていても右肩上がりで成長する社会では、リスクをとる必要がありません。何か問題が発生しても、動かずじっとしていればやがて時間が解決して事態が改善されていくからです。

読書位置961


終身雇用」というのが日本人の勤勉さの礎だなんだというのはすべて後付けであり、その根底にあるのは「面倒くさい」を避ける気質なのではないでしょうか。会社側からしても、新しい人材を探したり引っ張ったりしてくるのは「面倒くさい」。まさしく日本の終身雇用制度というのは、経営者側と労働者側の「面倒くさい」がうまく合致したことによって生まれたシステムといってもいいかもしれません。

読書位置1000


物事を変えない、何もしていないことを丁寧に「なぜできない」というふうにできない理由として説明するのが、日本人は非常に得意だと思います。とくに公務員、銀行員、企業の役員のこのスキルには、むしろ逆に感動さえ覚えます。

読書位置1037


このような切り替えの早さというのは、他の先進国にはない日本の特徴と言えるでしょう。歴史を見ても、昨日まで尊王攘夷だと叫んでいた人たちがいきなり開国論者になる。このような柔軟な思考は欧米社会、少なくともイギリスにはありません。

読書位置1078


戦後、日本経済が右肩上がりで成長していくなかで、「面倒くさい文化」というものは日本の「強み」だったのかもしれません。  リスクをとる必要もなく、生産性を上げる必要もない。勤勉な労働者が企業に忠誠を誓って、コツコツと働くことで、昨日より今日、今日より明日と、企業は黙っていても大きくなっていきました。そのような高度経済成長社会で、組織のあり方、社員の働き方、経営者のあり方を問い質すような人間が「面倒くさい」と疎まれるようになるのは、ある意味では当然です。

読書位置1100


これからは人口激減時代に入りますので、これまでのような右肩上がりの恵まれた経済環境ではなく、正反対のアゲインストの環境ですので、職人魂、秩序志向などだけではこの逆風を乗り越えられないのは明白です。  賢く工夫して、しっかりとした経営をしていかないといけません。そこでインテレクチュアル(intellectual、以下インテレ)の出番です。  これは企業の経営者、評論家、マスコミの一部など、昔で言う「支配階級」を指すものです。  要するにインテレとは国策についての議論を形成したり、その議論の結果に影響を与えることのできる人、あるいはその責任を負うべき人のことなのです。日本ではまだあまり馴染みがない言葉かもしれませんが、good reasoning power(論理的に判断する力)とでも理解していただきたいと思います。

読書位置1123


woolly thinkingによって、しなければならない改革のために必要な、インテレによる議論の焦点が決まらず、問題の本質の特定自体もはっきりしないので、いつまでたってもその議論がまとまらず、そのために社会が進歩せずに、いつも表面化した問題の事後処理をするだけになってしまう傾向が強くなるのです。

読書位置1149


インドでは地方によってナンといただいたりもするものが、なぜもっぱらご飯と一緒に食べられるようになったかというと、イギリスにカレーを持ち帰ったと言われているヘイスティングズ(後のベンガル総督)が駐在していたのがベンガル地方だったからです。  ここはインドのなかでもカレーを米にかけて食べる習慣があったため、「米と一緒に食べるカレー」がイギリスに伝わったのだと考えられています。

読書位置1244


日本人は今日はフレンチ、明日はパスタ、明後日は豚カツ、と食事に多様性がありますが、イタリアならば一週間すべてがイタリア料理だけなので、ピザひとつとっても種類が無数にあるのです。日本のピザもいろいろ種類があると思うかもしれませんが、どこのレストランへ行ってもほぼ同じ数種類の内容です。

読書位置1278


言いがかりをつけたいわけではありません。woolly thinkingによって、本来もっているポテンシャルを見落としてしまう恐れがあるということが言いたいのです。たとえば、ブームと言いながらも五五〇〇軒しかないということであれば、外国人が和食のつくり方を学べるスクールを作ればどうでしょう。これをビジネスチャンスととらえれば、そこに大きな成長の芽があるかもしれないのです。

読書位置1288


英語の辞書を引くと、woolly thinkingの説明のたとえに、「木の枝を切り落とすときに、その枝に座る行為」と書いて、危険な例として書いてあります。

読書位置1448


海外においてもマナーなどが観光の主たる動機になるというデータがあれば話は別ですが、それは確認できません。たしかにその国のマナーなどは、リピーターの獲得にはつながるとは思いますが、日本を観光する主たる動機になる可能性としては低いです。ならば、それをいくらアピールしたところで、無駄な努力であり、そこに力を入れれば入れるほど、観光のアピールが失敗をする恐れが出てくるということです。

読書位置1372


あるデータによれば世界一治安の良い国がアイスランドですが、年間の観光客は八〇万人しかいません。

読書位置1382


アメリカは議論を嫌う文化です。イギリスは議論が好きですが、その議論の基本はロジックです。

読書位置1426


これは私の仮説ですが、日本人がエンジニアリングと理数系に強いというのは、数学、化学、物理学となるとロジックそのものの世界でwoolly thinkingが排除されやすいからではないでしょうか。woolly thinkingが排除された人々が能力をいかんなく発揮しているのです。ちなみに、私が一番高く評価する日本人経営陣の大半を理数系出身者が占めているという事実も、私にとって興味深いです。

読書位置1439


食卓の話といえば、今のレストランの給仕スタイルはもともとロシアからやってきた作法だというのはご存じでしょうか。ロシア作法は、コースごとにそのコースの食べ物をあらかじめお皿に盛りつけて、一人ひとりのお客様に持っていくやり方です。スタッフは大変ですが、客からすれば豪華な気分が味わえるので好まれました。

読書位置1475


フランスの作法とは、その食事会で食べるものを、食べる人が席に着く前までにすべてテーブルに並べるというものです。クリスマスの食事のときや、一部世代の人々の間にはまだ多少残っています。たとえば、野菜をボウルに入れて皆で回してとったり、お肉を大きなお皿に載せて回しておのおので取るやり方はフランス作法の名残です。かつてのイギリスでは、階級が上に行けば行くほど、ロシアの作法が好まれたということもあって、現在はこのフランスの作法はあまり残っていません。

読書位置1480


つまり、「観光」というのは、世界では発展、繁栄が約束されていると言っても過言ではない市場なのです。

読書位置1548


ものは考えようです。世界平均が九パーセントで、日本は現在は二パーセント足らずということは裏を返せば、世界平均の取り組みをおこなえば七パーセント以上の成長が見込めるということです。  つまり、ポジティブな見方をすれば、日本にはまだ大きな「伸びしろ」があるということなのです。

読書位置1561


日本は外国人観光客が少ないということにくわえて、さらにそれらの人々が思いのほかお金をつかっていないというダブルパンチで、GDP貢献度二パーセントという結果になっている可能性が高いのです。

読書位置1586


日本には「お金を落とす外国人」があまり訪れていないのです。これこそが、観光業がGDP貢献二パーセントに留まっている二つ目の大きな理由なのです。

読書位置1600


日本の観光業のGDP貢献度を上げていくには、観光客の絶対数を増やしていくということが必要なのは言うまでもありませんが、それと並行して日本にほとんどやってきていない「観光にお金を落とす外国人」を招致しなくてはいけません。  そのために「古いものが残っている」という特徴、つまり文化財というのは大きな「強み」になるのです。

読書位置1608


が京都で町家を購入したときは、さまざまな人に外国人に売るのは絶対だめだとか、外国人が日本文化を潰す権利はないなどとさんざんな批判を受けました。ただ、後で調べると、批判している人の多くは、私のように古い町家をできる限り再現したりせず、自分の町家を潰して快適な現代風の家で暮らしている人でした。

読書位置1674


解決策を探して、工夫することなく、ただ単に禁止をする、禁止の看板が至るところにあることが特徴です。役所はとりあえず文句に応えた、というふうにしたいのか、すぐに禁止に走るといった傾向が強いと感じます。

読書位置1724


日本も自分たちがどこを伸ばすべきか、また成長の余地があるのはどこなのかということを真剣に考えて、それを伸ばす政策を実行すればいいだけの話なのですから。  そういう意味では、日本の未来は明るいです。しかし、何やら不穏な空気が流れています。  それが「はじめに」でふれた、テレビや雑誌における「日本人はすごい!」「日本の技術力を世界が評価」というような「自画自賛」です。  といっても、ここで誤解をしていただきたくないのは、「愛国心」をもってはいけないということではありません。  ただ、そのような「愛国心」があるのであれば、なおさら感情的なデータに惑わされることなく、「数字」などに基づいて事実を客観的に読み解く姿勢が重要になってくるのです。感情移入をして物事を見ると、人間はどうしても自分に都合の良い結論にとびついてしまいます。それが何の問題解決にもならないことは、バブル崩壊時の不良債権問題がよく示しています。

読書位置1799


日本人エンジニアの生産性は高いのか?

アトキンソンさんは日本人の「弱み」を「伸びしろ」と言い換えてくれていますが、日本人の「勤勉だけど面倒くさがり屋」という何とも不思議な特性は、生産性の低さの原因なのではないかと大いに納得した次第ですが、翻って我々エンジニアの生産性を考えた時に、何が課題で何を変えていかなければならないのかというヒントが与えられたように思いますので、次回はその点をさらに掘り下げて考察してみたいと思います。

初秋の宮ヶ瀬ダムは涼しかった

初めてのヒルクライム

6月にロードバイクを始めてから標高100mを超える山は意識して避けてきたのですが、いつまでも子供みたいなことも言ってられないので、ちょっと高いところを目指してみることにしました。

いきなり標高700mを超えるサイクリストのトレーニングコースとして有名なヤビツ峠も考えたのですが、私のようなビギナーはいい笑いものになるという恐れから手始めとして宮ヶ瀬ダムを目指してみることにしました。

宮ヶ瀬周回_番号付

真夏の格好では寒い!

昨日の雨が上がって、天気予報では昼から日が射すとのこと。天候は問題ないだろうと朝6時45分に出発したのですが、平地でも霧の中を走っているみたいで霧雨を感じます。昼から暑くなりそうだということで上は半袖ジャージ、下はレーパンという真夏の格好で走り始めましたが、涼しいというよりむしろ寒いです。

霧雨がなかなか止まず気のせいか少し雨粒が大きくなってきたように思え、途中で雨宿りをしたくらいです。念のためお天気サイトで雨雲の状況を確認しましたが全くエコーはありません。

路面が少しでも濡れていると滑りやすいですし、ロードバイクは泥よけがないので舞い上がった砂や埃でジャージや車体が汚れてしまいます。

厚木を過ぎて山の方に向かってしばらく走ったところで、トイレ休憩で寄ったコンビニであまりにも寒いので思わずおでんを買ってしまいました。(地図の①)

 

愛川町はキンモクセイが多い?

今回のコースは中津川に沿って宮ヶ瀬まで登っていきますが、ずっと愛甲郡愛川町を通っていきます。

今日は車も少なく穏やかな中ペダルを漕いでいたのですが、時期なのかとてもキンモクセイの香りが漂っています。

途中写真のような巨大なキンモクセイの木を見かけました。(地図の②)道路の反対側からも強烈に香りがします。

キンモクセイの木をやたらに見かけたので、この辺はキンモクセイが有名なのかと思いましたが特に町の花とかではないようです。

車で通っていたらこんな経験もできないでしょう。

激坂始まる

キンモクセイまでは比較的緩やかな登りだったのですが、距離と時間からそろそろ急坂が始まるだろうと覚悟していたところ、その時はいきなりやってきました!

激坂始まる

こんな感じの急坂が延々と続く感じです。この後右前方に登っていきます。なぜか不動産売り出し中の赤いコーンが目立ちます。こんな山奥のどんな物件だろうかとか、しかも「良心不動産!?」(すごいネーミング)とか思わず脱力して自転車を降りてしまいましたが、ここはまだ序の口で初心者には手強い坂が続きます。ギアを一番軽くしても時速10kmも出ない坂は初めてです。

服部牧場で暫しの休憩

宮ヶ瀬ダムの下には県立あいかわ公園というのがあるのですがさらに急坂を登っていくと「服部牧場」という牧場に出ます。

ここにはソフトクリームやジェラートなどが食べられる「アイスクリーム工房カサリンガ」という店があります。着いた時は9時半頃だったのですが、開店は10時からとのこと。せっかく来たのだからと開店まで待つことにしました。

中学生サイクリストの一団も来ていました。最近の中学生はビンディング・ペダルとか普通に使っていてけっこう生意気です(笑)。

券売機でシングルジェラート380円の券を買って、25種類の中から好きなフレーバーを選びます。私は一番人気の「リッチミルク」にしてみました。大汗をかいたのと身体もいい感じで温まっているのでひときわ美味しく食べられました。自転車漕いでも来る価値があるジェラートです。

宮ヶ瀬ダム到着

服部牧場を出て、さらに激坂を登ると宮ヶ瀬ダムに出ます。

宮ヶ瀬ダムの高さは156mで上から見ると目がくらみそうです。この手前に「自転車進入禁止」の看板がありましたが、ダムの向こう側に渡らなければ帰ることができないので、自転車は降りて通ります。

曇っていたのであいにく遠くまで見えませんでしたが、紅葉の頃の晴れている日にまた来たいと思いました。

宮ヶ瀬湖畔からダウンヒル

宮ヶ瀬湖畔をしばらく走りますが景色が素晴らしいです。晴れていればもっとよかったのですが。

そして土山峠から一気にダウンヒルを下ります。標高300mからスピードの出し過ぎに気をつけながら爽快に山を降りて行きます。

厚木、海老名まで1時間もかからないくらいで戻ってくることができました。

家に着いたのが13:00だったのでちょうどいい運動になりました。