【Oracle Database】非表示列に作成した索引の状態は非表示になるのか

私のAdvent Calendarタスクが終わってしまった

#非表示列に作成した索引の状態は非表示になるのか
検証したいと思います

##非表示列を含む表を作成
```
SQL> create table test_invisible (col1 number primary key, name varchar(20) invisible);

Table created.
```

こんな感じ

DESCしてみる

```
SQL> desc test_invisible
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                      NOT NULL NUMBER
```

でないね

SET COLINVISIBLE ON すれば見えるみたい

```
SQL> SET COLINVISIBLE ON
SQL> desc test_invisible
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                      NOT NULL NUMBER
 NAME (INVISIBLE)                                   VARCHAR2(20 CHAR)
```

ちなみにDBA_TAB_COLSのHIDDEN_COLUMN確認すれば非表示列があるかどうか分かる

```
SQL> desc DBA_TAB_COLS
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(128)
 TABLE_NAME                                NOT NULL VARCHAR2(128)
 COLUMN_NAME                               NOT NULL VARCHAR2(128)
 DATA_TYPE                                          VARCHAR2(128)
 DATA_TYPE_MOD                                      VARCHAR2(3)
 DATA_TYPE_OWNER                                    VARCHAR2(128)
 DATA_LENGTH                               NOT NULL NUMBER
 DATA_PRECISION                                     NUMBER
 DATA_SCALE                                         NUMBER
 NULLABLE                                           VARCHAR2(1)
 COLUMN_ID                                          NUMBER
 DEFAULT_LENGTH                                     NUMBER
 DATA_DEFAULT                                       LONG
 NUM_DISTINCT                                       NUMBER
 LOW_VALUE                                          RAW(1000)
 HIGH_VALUE                                         RAW(1000)
 DENSITY                                            NUMBER
 NUM_NULLS                                          NUMBER
 NUM_BUCKETS                                        NUMBER
 LAST_ANALYZED                                      DATE
 SAMPLE_SIZE                                        NUMBER
 CHARACTER_SET_NAME                                 VARCHAR2(44)
 CHAR_COL_DECL_LENGTH                               NUMBER
 GLOBAL_STATS                                       VARCHAR2(3)
 USER_STATS                                         VARCHAR2(3)
 AVG_COL_LEN                                        NUMBER
 CHAR_LENGTH                                        NUMBER
 CHAR_USED                                          VARCHAR2(1)
 V80_FMT_IMAGE                                      VARCHAR2(3)
 DATA_UPGRADED                                      VARCHAR2(3)
 HIDDEN_COLUMN                                      VARCHAR2(3)
 VIRTUAL_COLUMN                                     VARCHAR2(3)
 SEGMENT_COLUMN_ID                                  NUMBER
 INTERNAL_COLUMN_ID                        NOT NULL NUMBER
 HISTOGRAM                                          VARCHAR2(15)
 QUALIFIED_COL_NAME                                 VARCHAR2(4000)
 USER_GENERATED                                     VARCHAR2(3)
 DEFAULT_ON_NULL                                    VARCHAR2(3)
 IDENTITY_COLUMN                                    VARCHAR2(3)
 SENSITIVE_COLUMN                                   VARCHAR2(3)
 EVALUATION_EDITION                                 VARCHAR2(128)
 UNUSABLE_BEFORE                                    VARCHAR2(128)
 UNUSABLE_BEGINNING                                 VARCHAR2(128)

SQL> select TABLE_NAME, COLUMN_NAME, HIDDEN_COLUMN from DBA_TAB_COLS where TABLE_NAME='TEST_INVISIBLE';

TABLE_NAME           COLUMN_NAME          HID
-------------------- -------------------- ---
TEST_INVISIBLE       COL1                 NO
TEST_INVISIBLE       NAME                 YES
```

##非表示列に索引作成
どうなるんだろう

```
SQL> create index index_for_invisible on test_invisible(name);

Index created.
```

普通に作成できた
INVISIBLEになっているのか確認してみる

```
SQL> select index_name,visibility from ind where index_name='INDEX_FOR_INVISIBLE';

INDEX_NAME
--------------------------------------------------------------------------------
VISIBILIT
---------
INDEX_FOR_INVISIBLE
VISIBLE
```

VISIBLEになっている（当然か）
非表示索引作るときはきちんとINVISIBLEにしましょうってことね