函式索引產生隱藏列
前兩天在進行LOGMNR操作的時候發現了空的列名,經檢查發現是函式索引造成的隱藏列。
由於需要處理一些已經提交的資料,且提交時間超過了可以閃回的時間,因此採用LOGMNR來處理。處理過程中,發現得到的SQL語句中,包含了空列的情況,情況類似下面的例子:
SQL> CONN SYS@YTK102 AS SYSDBA
輸入口令:
已連線。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
會話已更改。
SQL> SELECT GROUP#, FIRST_TIME FROM V$LOG;
GROUP# FIRST_TIME
---------- -------------------
1 2008-01-18 22:35:57
2 2008-01-20 18:58:37
3 2008-01-16 23:56:50
SQL> SELECT MEMBER FROM V$LOGFILE WHERE GROUP# = 2;
MEMBER
--------------------------------------------------------------
E:\ORACLE\ORADATA\YTK102\REDO02.LOG
SQL> ALTER SYSTEM SWITCH LOGFILE;
系統已更改。
SQL> EXEC DBMS_LOGMNR.ADD_LOGFILE('E:\ORACLE\ORADATA\YTK102\REDO02.LOG', DBMS_LOGMNR.NEW)
PL/SQL 過程已成功完成。
SQL> EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)
PL/SQL 過程已成功完成。
SQL> SELECT SQL_UNDO FROM V$LOGMNR_CONTENTS
2 WHERE SEG_NAME = 'T_LOGMNR';
SQL_UNDO
--------------------------------------------------------------------------
insert into "YANGTK"."T_LOGMNR"("ID","NAME","") values ('1','A',NULL);
insert into "YANGTK"."T_LOGMNR"("ID","NAME","") values ('2','B',NULL);
insert into "YANGTK"."T_LOGMNR"("ID","NAME","") values ('3','C',NULL);
可以看到T_LOGMNR表後面跟了一個空的列,而這個列的值也是NULL。
檢查表結構:
SQL> DESC YANGTK.T_LOGMNR
名稱 是否為空? 型別
--------------------------------------------- -------- ----------------
ID NOT NULL NUMBER
NAME VARCHAR2(30)
SQL> SELECT TABLE_NAME, COLUMN_NAME FROM DBA_TAB_COLUMNS
2 WHERE TABLE_NAME = 'T_LOGMNR'
3 AND WNER = 'YANGTK';
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
T_LOGMNR ID
T_LOGMNR NAME
從資料字典中找不到這個空列的資訊,直接查詢COL$表:
SQL> SELECT OBJECT_ID FROM DBA_OBJECTS
2 WHERE OBJECT_NAME = 'T_LOGMNR'
3 AND WNER = 'YANGTK';
OBJECT_ID
----------
53636
SQL> SELECT NAME FROM COL$ WHERE OBJ# = 53636;
NAME
------------------------------
ID
NAME
SYS_NC00003$
從COL$中可以看到這個隱藏列了,下面進一步檢查,這個隱藏列到底是什麼:
SQL> SELECT NAME, DEFAULT$ FROM COL$ WHERE OBJ# = 53636;
NAME DEFAULT$
------------------------------ --------------------------------------------
ID
NAME
SYS_NC00003$ DECODE("ID",1,"NAME"||'1',"NAME"||'2')
目前已經可以看出這個列是一個基於基礎列的函式表示式,對比函式索引列:
SQL> SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS FROM DBA_INDEXES
2 WHERE TABLE_NAME = 'T_LOGMNR'
3 AND TABLE_OWNER = 'YANGTK';
INDEX_NAME INDEX_TYPE UNIQUENES
------------------------------ --------------------------- ---------
SYS_C005983 NORMAL UNIQUE
IND_T_LOGMNR_NAME FUNCTION-BASED NORMAL NONUNIQUE
SQL> SELECT COLUMN_EXPRESSION FROM DBA_IND_EXPRESSIONS
2 WHERE TABLE_NAME = 'T_LOGMNR'
3 AND TABLE_OWNER = 'YANGTK'
4 AND INDEX_NAME = 'IND_T_LOGMNR_NAME';
COLUMN_EXPRESSION
----------------------------------------------------------------------------
DECODE("ID",1,"NAME"||'1',"NAME"||'2')
可以看到,這個隱藏列就是函式索引產生的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-154882/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 隱藏索引索引
- GridManager 隱藏列
- Oracle 隱藏列Oracle
- mysql8.0新特性--隱藏索引MySql索引
- GridManager--隱藏列功能
- MySQL 8.0 中的索引可以隱藏了!MySql索引
- OSX中隱藏和顯示[隱藏檔案]的命令列命令列
- MySQL 索引機制背後的隱藏之道MySql索引
- win10怎樣隱藏工作列_win10全屏工作列隱藏操作方法Win10
- 工作列隱藏了怎麼還原 電腦隱藏了工作列怎麼恢復
- tensorflow2 自定義損失函式使用的隱藏坑函式
- Android 隱藏系統狀態列Android
- win10工作列如何取消隱藏_win10電腦工作列怎麼取消隱藏Win10
- dubbo泛化引發的生產故障之dubbo隱藏的坑
- 牛逼!MySQL 8.0 中的索引可以隱藏了…MySql索引
- win10平板模式怎麼隱藏工作列_wom10平板模式工作列隱藏如何操作Win10模式
- 如何隱藏工作列的圖示win10_win10怎麼隱藏狀態列圖示Win10
- WPF --- 如何以Binding方式隱藏DataGrid列
- jqgrid動態顯示,隱藏指定列
- Ant Design Vue 的 table 隱藏特定列Vue
- bootstrap 響應式工具 隱藏效果boot
- Matlab產生隨機數函式小結Matlab隨機函式
- 陣列排序函式-php陣列函式(一)陣列排序函式PHP
- win10工作列怎麼隱藏起來_windows10如何隱藏工作列Win10Windows
- win10隱藏工作列圖示怎麼設定 win10隱藏工作列圖示方法介紹Win10
- MySQL索引失效之隱式轉換MySql索引
- 眼見為實,看看MySQL中的隱藏列!MySql
- 簡單介紹tensorflow2 自定義損失函式使用的隱藏坑函式
- 電腦工作列隱藏了怎麼顯示出來 win10電腦工作列隱藏怎麼調出來Win10
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- [20180509]函式索引問題.txt函式索引
- MySQL函式索引及優化MySql函式索引優化
- [20211231]函式索引測試.txt函式索引
- matlab中的產生隨機數的rand函式Matlab隨機函式
- Mac顯示和隱藏“隱藏檔案”命令Mac
- 隱藏資料夾怎麼取消隱藏 關閉隱藏檔案的辦法
- Android 顯示、隱藏狀態列和導航欄Android
- vue3 el-table控制列顯示隱藏Vue
- 命令列解析函式命令列函式