查看组成一个Index的column有哪些
下面是创建一个表,并在上面建立一些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有哪些的更多相关文章
- modifytime是一个神奇的column name----这边文章是错的totally,因为我的实验不彻底。timestamp属性很神奇,头一个timestamp,会自动的成DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在mysql里边modifytime是一个神奇的column name,试一下. 请执行sql语句 CREATE TABLE `test_time` ( `modifytime` timestamp ...
- 查看某一个点是否在某个多边形内 使用ST_Contains函数
查看某一个点是否在某个多边形内 使用ST_Contains函数 --LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.35 ...
- 使用performance monitor 查看 每一个cpu core的cpu time
使用performance monitor 查看 每一个cpu core的cpu time: 打开performance monitor,添加 counter 如下 运行一段cpu bound 的代码 ...
- git log查看某一个分支的提交
如果想查看某一个分支的提交信息:git log 或者是查看分支名:git log $分支名/tag名/远程分支名 查看提交的详情: git log -p
- Git查看某一个文件的历史提交信息
工作中我们有时候想要查看某一个文件的历史提交版本,] 还想看都修改过那些内容,那么这两个简单的命令就会帮到你了, 话不多说,comeBaby...... 1,首先查看一个文件的历史提交信息 git l ...
- parquet文件格式——本质上是将多个rows作为一个chunk,同一个chunk里每一个单独的column使用列存储格式,这样获取某一row数据时候不需要跨机器获取
Parquet是Twitter贡献给开源社区的一个列数据存储格式,采用和Dremel相同的文件存储算法,支持树形结构存储和基于列的访问.Cloudera Impala也将使用Parquet作为底层的存 ...
- adb进阶知识,如何过滤只查看某一个app的日志
前面大概学习了adb基础,但是adb的存在,在测试人员中究竟有什么必要,以及看log时,那么多的log,让我们看个屁啊,所以这一次,我决定一定要把adb这件事情搞清楚. 1.先来看最感兴趣的adb ...
- SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划
我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...
- pandas更换index,column名称
1)仅换掉index名称 df.index = list 2)调整index时,后面的项目也要跟着调整: df.reindex(list) 注意如果list中出现了df中没有的index,后面的项目会 ...
随机推荐
- IntelliJ IDEA(Community版本)的下载、安装和WordCount的初步使用(本地模式和集群模式)
不多说,直接上干货! 对于初学者来说,建议你先玩玩这个免费的社区版,但是,一段时间,还是去玩专业版吧,这个很简单哈,学聪明点,去搞到途径激活!可以看我的博客. 包括: IntelliJ IDEA(Co ...
- Disconf 学习系列之Disconf 的主要目标
不多说,直接上干货! 部署极其简单:同一个上线包,无须改动配置,即可在 多个环境中(RD/QA/PRODUCTION) 上线: 部署动态化:更改配置,无需重新打包或重启,即可 实时生效: 统一管理:提 ...
- gles2.0环境的在windows上的建立
这里也有一个视频来讲解,大家可以看下,可以多提问题,意见,建议 http://edu.csdn.net/course/detail/606 #include <Windows.h> #in ...
- SpringMVC访问WEB-INF下的jsp的方法
当输入localhost:8080/项目名 浏览器弹出不知道神马错误 The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res ...
- Solidity两个string的比较
有三种比较方法 方法一:比较string的哈希值方法二:先比较string的长度,再比较每个对应位置的字母是否相同方法三:先比较string的长度,再比较string的哈希值一.比较string的哈希 ...
- Nodejs学习笔记(十二)—定时任务(node-schedule)
写在之前 在实际开发项目中,会遇到很多定时任务的工作.比如:定时导出某些数据.定时发送消息或邮件给用户.定时备份什么类型的文件等等 一般可以写个定时器,来完成相应的需求,在node.js中自已实现也非 ...
- android开发学习笔记系列(2)-android应用界面编程
前言 本篇博客将会简要介绍andriod开发过程中的一些界面元素和编程的实现,我将大家走进安卓的XML世界,当然可能会涉及到java代码,当然本文主要是介绍XML文件的界面布局. 那么我们的XML存在 ...
- 详解REST架构风格
编辑推荐: 本文来自于segmentfault.com,一起了解REST的内在,认识REST的优势,而不再将它当作是“理所当然” 引言 作为Web开发者,你可能或多或少了解一些REST的知识,甚至已经 ...
- histoty显示时间戳
设置Linux可以查看历史命令的执行时间 大家都知道Linux平台上,可以通过history命令查看最近所执行过的命令,但history命令默认所显示的只有编号和命令的,只知道命令是最近所执行 ...
- s11d27 算法
s11d27 算法 一.理论 1.1 时间复杂度和空间复杂度的理论: 1)空间复杂度: 是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了, 简单说就是递归集算时通常是反 ...