记录关于oracle 12c 索引之前没注意过的点。使用metadata.get_ddl中抓取对应索引,发现以下语句:
CREATE UNIQUE INDEX "T1"."SYS_IL0000073765C00002$$" ON "T1"."T0206" (
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE( INITIAL 65536 NEXT 1048576 MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "T1"
PARALLEL (DEGREE 0 INSTANCES 0)
SQL> select INDEX_OWNER,INDEX_NAME,COLUMN_NAME from dba_ind_columns where TABLE_NAME='T0206';
no rows selected
没有看到对应列信息。第一反应是long字段设置小了,第一行显示不全,set long 给到最大,还有说set longchunksize 的,尝试返回结果仍是一样。查询dba_ind_columns也没有列信息。
oracle建表并不像mysql依赖主键或隐含主要索引,但遇到表含有LOB字段时,Oracle会为含有LOB字段的列单独创建一个lobindex。查看字段属性
SQL> select owner,index_name,index_type,table_name from dba_indexes where table_owner='T1';
OWNER INDEX_NAME INDEX_TYPE TABLE_NAME
------------------------------ ------------------------------ --------------------------- ------------------------------
T1 SYS_IL0000073765C00002$$ LOB T0206
SQL> l
1* select OWNER,TABLE_NAME,COLUMN_NAME,INDEX_NAME from dba_lobs where TABLE_NAME='T0206'
SQL> /
OWNER TABLE_NAME COLUMN_NAME INDEX_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------
T1 T0206 NAME SYS_IL0000073765C00002$$
SQL> desc T0206
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(5000)
oracle 12c可以调整支持4000字节字符串。业务库之前已经调整支持,T0206表存在超4000长度(name VARCHAR2(5000))的字段。这么看对超过4000字节的字段,oracle默认视为lob字段并进行lob index的建立。