Oracle查找基于函数的索引

时间:2015-04-24 00:08:39

标签: oracle plsql

如何创建查询以返回从基于Oracle函数的索引引用的用户列?

EG。我创建了一个索引,如:

CREATE INDEX MY_INDEX ON MY_TABLE (SQRT(MY_COL));

对于非基于函数的索引,我只查询ALL_IND_COLUMNS,例如:

SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION
FROM ALL_IND_COLUMNS 
WHERE INDEX_NAME = 'MY_INDEX' 

但是,此查询会返回系统生成列的COLUMN_NAME,例如' SYS_NC00012 $'而不是实际的表格列' MY_COL'基于函数的索引使用。

我知道我可以查询DBMS_METADATA并读取返回的索引创建DDL

SELECT DBMS_METADATA.GET_DDL('INDEX', 'MY_INDEX') AS QUERY_STRING FROM DUAL    

但这意味着我必须解析对我来说不可靠的函数文本。

因此,任何人都可以指出我正确的方向,我如何能够精确地确定哪个实际的表列是基于函数的索引定义的?

2 个答案:

答案 0 :(得分:2)

 SQL> Create table my_table ( my_col int);
 Table Created;

 SQL> CREATE INDEX MY_INDEX ON MY_TABLE (SQRT(MY_COL));
 Index Created 

 SQL> select
  2     table_name c1,
  3     index_name c2,
  4     column_expression c3
  5  from
  6     dba_ind_expressions
  7  where
  8     table_name='MY_TABLE';


 Table                     Index
 name                      Name                      Expression
 ------------------------ ------------------------- ---------------------------------------
 MY_TABLE                  MY_INDEX                  SQRT("MY_COL")

答案 1 :(得分:-1)

你可以用“COMMENT ON COLUMN”做一些技巧,试试这个

Create table my_table ( my_col int);

CREATE INDEX MY_INDEX ON MY_TABLE (SQRT(my_col));

COMMENT ON COLUMN my_table.my_col    IS 'MY_INDEX:my_col'; -- add your index:col 

select * from ALL_COL_COMMENTS where table_NAME ='MY_TABLE'

你可以使用这个基于特技功能的索引。