下面是创建一个表,并在上面建立一些index的SQL.我们会新建一个用户,然后再那个schema下运行下面的SQL.

create table indtest (
f1_num number(10)  not  null,
f2_char varchar2(20)  not  null,
f3_numnull number(10) null,
f4_num  number(10),
f5_char  varchar2(20)
);
alter table indtest  add constraint PK_T_indtest primary key (f1_num);
create index indtest_f2_char  on indtest (f2_char ASC);
create index indtest_f23_char  on indtest (f2_char, f3_numnull ASC);
create index indtest_f4_num  on indtest (f4_num DESC);
create index func_indtest on indtest(upper(f2_char));
create index func_indtest_component on indtest(upper(f2_char), f3_numnull ASC);

1. 准备工作

SQL> select * from v$version;

BANNER
-----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> create user ind_test account unlock identified by test default tablespace users quota 500M on users;

用户已创建。
SQL> grant resource , connect to ind_test;

授权成功。

SQL> conn ind_test/test
已连接。

SQL> create table indtest (
  2  f1_num number(10)  not  null,
  3  f2_char varchar2(20)  not  null,
  4  f3_numnull number(10) null,
  5  f4_num  number(10),
  6  f5_char  varchar2(20)
  7  );

表已创建。

SQL> alter table indtest  add constraint PK_T_indtest primary key (f1_num);

表已更改。

SQL> create index indtest_f2_char  on indtest (f2_char ASC);

索引已创建。

SQL> create index indtest_f23_char  on indtest (f2_char, f3_numnull ASC);

索引已创建。

SQL> create index indtest_f4_num  on indtest (f4_num DESC);

索引已创建。

SQL> create index func_indtest on indtest(upper(f2_char));

索引已创建。

SQL> create index func_indtest_component on indtest(upper(f2_char), f3_numnull ASC);

索引已创建。

查看Index的组成column

 1. 使用DBMS_METADATA的下面两个函数.

  dbms_metadata.get_ddl
  dbms_metadata.get_depentent_ddl

SQL> select to_char(dbms_metadata.get_DDL('INDEX','FUNC_INDTEST_COMPONENT','IND_TEST'))  "TEXT" from dual;

TEXT
------------------------------------------------------------------------------------------------------------------------
  CREATE INDEX "IND_TEST"."FUNC_INDTEST_COMPONENT" ON "IND_TEST"."INDTEST" (UPPER("F2_CHAR"), "F3_NUMNULL")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOCOMPRESS LOGGING
  TABLESPACE "USERS"

/*不输出与STORAGE有关的参数*/

SQL> EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', false);

PL/SQL 过程已成功完成。

/*不输出与SEGMENT有关的参数*/

SQL> EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', false);

PL/SQL 过程已成功完成。

SQL> select to_char(dbms_metadata.get_DDL('INDEX','FUNC_INDTEST_COMPONENT','IND_TEST'))  "TEXT" from dual;

TEXT
-----------------------------------------------------------------------------------------------------------------
  CREATE INDEX "IND_TEST"."FUNC_INDTEST_COMPONENT" ON "IND_TEST"."INDTEST" (UPPER("F2_CHAR"), "F3_NUMNULL")

查看以下的V$试图.

dba/all/user_indexes
dba/all/user_ind_columns
dba/all/user_ind_expressions

在user_ind_columns里面,一个index由几个column组成就对应几行,只是有些index是function index,因此某些列的名字是系统生成的。

此时到user_ind_expressions里面可以看到对应的expression,它们是通过index_name 和column_position一起关联起来的.

SQL> col index_name format a30;
SQL> col table_name format a30;
SQL> col column_name format a30;
SQL> select * from user_ind_columns where index_name=upper('indtest_f2_char');

INDEX_NAME                     TABLE_NAME                     COLUMN_NAME                    COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESCEND
------------------------------ ------------------------------ ------------------------------ --------------- ------------- ----------- --------
INDTEST_F2_CHAR                INDTEST                        F2_CHAR                                   1               20          20 ASC

SQL> select * from user_ind_columns where index_name=upper('func_indtest_component');

INDEX_NAME                     TABLE_NAME                     COLUMN_NAME                    COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESCEND
------------------------------ ------------------------------ ------------------------------ --------------- ------------- ----------- --------
FUNC_INDTEST_COMPONENT         INDTEST                        SYS_NC00007$                              1               20          20 ASC
FUNC_INDTEST_COMPONENT         INDTEST                        F3_NUMNULL                                2               22           0 ASC

SQL> select * from user_ind_expressions where index_name=upper('func_indtest_component');

INDEX_NAME                     TABLE_NAME                     COLUMN_EXPRESSION                                                        COLUMN_POSITION
------------------------------ ------------------------------ -------------------------------------------------------------------------------- ---------------
FUNC_INDTEST_COMPONENT         INDTEST                        UPPER("F2_CHAR")                                                                       1

SQL> select * from user_ind_expressions where index_name=upper('func_indtest');

INDEX_NAME                     TABLE_NAME                     COLUMN_EXPRESSION                                                        COLUMN_POSITION
------------------------------ ------------------------------ -------------------------------------------------------------------------------- ---------------
FUNC_INDTEST                   INDTEST                        UPPER("F2_CHAR")                                                                       1

SQL> select * from user_ind_columns where index_name=upper('func_indtest');

INDEX_NAME                     TABLE_NAME                     COLUMN_NAME                    COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESCEND
------------------------------ ------------------------------ ------------------------------ --------------- ------------- ----------- --------
FUNC_INDTEST                   INDTEST                        SYS_NC00007$                              1               20          20 ASC

SQL> select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,UNIQUENESS,COMPRESSION from user_indexes order by INDEX_TYPE;

INDEX_NAME                     INDEX_TYPE                 TABLE_OWNER TABLE_NAME   TABLE_TYPE  UNIQUENESS        COMPRESSION
---------------------------    -------------------------- ----------- ------------ ----------- ----------------- -----------
INDTEST_F4_NUM                 FUNCTION-BASED NORMAL       IND_TEST   INDTEST       TABLE      NONUNIQUE          DISABLED
FUNC_INDTEST_COMPONENT         FUNCTION-BASED NORMAL       IND_TEST   INDTEST       TABLE      NONUNIQUE          DISABLED
FUNC_INDTEST                   FUNCTION-BASED NORMAL       IND_TEST   INDTEST       TABLE      NONUNIQUE          DISABLED
PK_T_INDTEST                   NORMAL                      IND_TEST   INDTEST       TABLE      UNIQUE             DISABLED
INDTEST_F23_CHAR               NORMAL                      IND_TEST   INDTEST       TABLE      NONUNIQUE          DISABLED
INDTEST_F2_CHAR                NORMAL                      IND_TEST   INDTEST       TABLE      NONUNIQUE          DISABLED
已选择6行。

这里的结果显示 INDTEST_F4_NUM 也是一个function index, 但是我们创建的时候并没有指定函数,而是指定了DESC 顺序.

下面的查询结果页显示出INDTEST_F4_NUM 确实被当成是function index处理的,只是expression就是自己. 我推测这是Oracle对DESC index的特殊处理.

SQL> select * from user_ind_columns where index_name=upper('indtest_f4_num');

INDEX_NAME                     TABLE_NAME                     COLUMN_NAME                    COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESCEND
------------------------------ ------------------------------ ------------------------------ --------------- ------------- ----------- --------
INDTEST_F4_NUM                 INDTEST                        SYS_NC00006$                              1               34           0 DESC

SQL> select * from user_ind_expressions where index_name=upper('indtest_f4_num');

INDEX_NAME                     TABLE_NAME                     COLUMN_EXPRESSION                                                        COLUMN_POSITION
------------------------------ ------------------------------ -------------------------------------------------------------------------------- ---------------
INDTEST_F4_NUM                 INDTEST                        "F4_NUM"                                                                               1

把上面的三个V$视图一起联合起来,便有下面的SQL.当colum_name是系统生成的时候,表明column_expression就是一个function column.

SQL> select
  2  ind_columns.index_name,
  3  ind_expression.column_expression,
  4  ind_columns.column_name
  5  from user_indexes ind
  6  left outer join user_ind_columns ind_columns on(ind.index_name=ind_columns.index_name)
  7  left outer join user_ind_expressions ind_expression on
  8  (ind_expression.index_name = ind_columns.index_name and ind_expression.column_position = ind_columns.column_position)
  9  where ind.index_name=upper('FUNC_INDTEST_COMPONENT');

INDEX_NAME                     COLUMN_EXPRESSION                                                        COLUMN_NAME
------------------------------ -------------------------------------------------------------------------------- ------------------------------
FUNC_INDTEST_COMPONENT         UPPER("F2_CHAR")                                              SYS_NC00007$
FUNC_INDTEST_COMPONENT                                                                                             F3_NUMNULL

查看组成一个Index的column有哪些的更多相关文章

  1. modifytime是一个神奇的column name----这边文章是错的totally,因为我的实验不彻底。timestamp属性很神奇,头一个timestamp,会自动的成DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    在mysql里边modifytime是一个神奇的column name,试一下. 请执行sql语句 CREATE TABLE `test_time` ( `modifytime` timestamp ...

  2. 查看某一个点是否在某个多边形内 使用ST_Contains函数

    查看某一个点是否在某个多边形内  使用ST_Contains函数 --LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.35 ...

  3. 使用performance monitor 查看 每一个cpu core的cpu time

    使用performance monitor 查看 每一个cpu core的cpu time: 打开performance monitor,添加 counter 如下 运行一段cpu bound 的代码 ...

  4. git log查看某一个分支的提交

    如果想查看某一个分支的提交信息:git log 或者是查看分支名:git log $分支名/tag名/远程分支名 查看提交的详情: git log -p

  5. Git查看某一个文件的历史提交信息

    工作中我们有时候想要查看某一个文件的历史提交版本,] 还想看都修改过那些内容,那么这两个简单的命令就会帮到你了, 话不多说,comeBaby...... 1,首先查看一个文件的历史提交信息 git l ...

  6. parquet文件格式——本质上是将多个rows作为一个chunk,同一个chunk里每一个单独的column使用列存储格式,这样获取某一row数据时候不需要跨机器获取

    Parquet是Twitter贡献给开源社区的一个列数据存储格式,采用和Dremel相同的文件存储算法,支持树形结构存储和基于列的访问.Cloudera Impala也将使用Parquet作为底层的存 ...

  7. adb进阶知识,如何过滤只查看某一个app的日志

    前面大概学习了adb基础,但是adb的存在,在测试人员中究竟有什么必要,以及看log时,那么多的log,让我们看个屁啊,所以这一次,我决定一定要把adb这件事情搞清楚.   1.先来看最感兴趣的adb ...

  8. SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划

    我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...

  9. pandas更换index,column名称

    1)仅换掉index名称 df.index = list 2)调整index时,后面的项目也要跟着调整: df.reindex(list) 注意如果list中出现了df中没有的index,后面的项目会 ...

随机推荐

  1. Android4.0以上版本比较靠谱的获取手机屏幕分辨率的方法

    /** * 获取虚拟按键栏高度 * * @param context * @return */ public static int getNavigationBarHeight(Context con ...

  2. JAVA使用Gecco爬虫 抓取网页内容(附Demo)

    JAVA 爬虫工具有挺多的,但是Gecco是一个挺轻量方便的工具. 先上项目结构图. 这是一个 JAVASE的 MAVEN 项目,要添加包依赖,其他就四个文件.log4j.properties 加上三 ...

  3. Maven 学习笔记(二)

    项目最近开始使用maven去管理项目啦,说真的对于maven是一窍不通啊,今天和同事在回家的路上聊天的时候同事说他去第一家公司面试的时候人家问他 maven 怎么打包,当时我就懵逼了,因为我也不知道啊 ...

  4. .bat学习-基础语法(常用)

    一般来说,脚本或者语言都有相同地方 定义变量,输入,输出,判断条件等等.知道的相同之处,我们就可以借助强大的搜索引擎进行查找我们想要知道的东西. bat为批处理脚本BATCH.现在只知道是使用于win ...

  5. php通过生成动态变量(变量名中还有变量)

    借鉴:http://blog.sina.com.cn/s/blog_7193eeac0100zwld.html 如果想for循环生成变量 如: $a1,$a2,$a3.... $name = &quo ...

  6. 面试题28:单链表一次遍历删除从后往前的第n个节点

    class Solution { public: ListNode *removeNthFromEnd(ListNode *head, int n) { ListNode* fake = ); fak ...

  7. Linux 文件内容查看工具介绍-cat,less,more,tail,head

    Linux 文件内容查看工具介绍 作者:北南南北来自:LinuxSir.Org摘要: 本文讲述几种常用文件内容的查看工具,比如cat.more.less.head.tail等,把这些工具最常用的参数. ...

  8. Rails中实现批量删除

    在Rails生成的控制器模版中,包含的destroy只能处理单个对象,而批量删除要求能够同时处理多个对象,这需要自定义一个批量操作action.批量删除的效果图如下:

  9. vue2.x中请求之前数据显示以及vuex缓存的问题

    在项目中遇到两个问题,简单的做个笔记来记录自己解决的问题,可能不是很好的处理办法,欢迎提出,自己还在不断优化中... 第一个是vue在加载页面的时候,会先加载静态资源,这个时候数据还没有请求回来,用户 ...

  10. JavaScript预编译详解

    一.js运行三部曲: 1.语法分析(通篇扫描看有没有语法错误) 2.预编译 3.解释执行 二.预编译前奏 1.imply global 暗示全局变量:任何变量如果未经声明就赋值,此变量为全局对象所有 ...