私の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にしましょうってことね