Oracle 显示索引信息
- 格式:doc
- 大小:66.00 KB
- 文档页数:2
oracle强制索引语法Oracle 数据库在处理复杂查询时通常会优化 SQL 查询的执行计划,以获得更快、更高效的查询结果。
但有时由于待处理的查询语句比较复杂,Oracle 数据库的执行计划可能会选择错误的索引,从而导致查询效率慢的问题。
此时就需要利用 Oracle 数据库强制使用指定的索引,提高查询效率。
以下是有关 Oracle 强制索引语法的详细介绍。
第一步:了解Oracle SQL 强制索引的含义Oracle 强制索引是指明确告诉 Oracle 数据库使用哪个特定的索引,而不是根据执行计划来选择索引。
通过强制索引,我们可以确保查询时使用我们希望的索引以获得更高效的结果。
强制索引的方法是将指定的索引名称包含在 SQL 查询中,让 Oracle 数据库执行这个指定的索引。
强制索引语法如下所示:SELECT /*+ INDEX (table index_name) */ columnsFROM tableWHERE conditions;此语法中的 "INDEX" 表示强制索引, "table" 是要查询的表名,"index_name" 是要强制使用的索引名称, "columns" 是要查询的列名, "conditions" 是查询条件。
第二步:掌握Oracle SQL 强制索引的适用场景Oracle SQL 强制索引不应该在所有查询中都使用,只适用于以下场景:1.当 Oracle 数据库选择错误的索引时,而我们知道正确的索引。
2.当查询的表非常大,缺乏适当的索引,而我们知道可以使用已有的索引进行优化。
3.当查询中使用了函数,函数操作无法使用索引,但我们知道可以将任何函数操作移动到查询之前,从而优化查询。
第三步:Oracle SQL 强制索引的注意事项1.强制索引可能会导致查询结果变得更慢,甚至导致查询失败。
oracle查询表索引语句Oracle是一种关系型数据库管理系统,可以使用SQL语言进行数据查询和操作。
在Oracle中,索引是一种特殊的数据库对象,它可以提高查询效率和数据访问速度。
索引可以根据一个或多个列值进行排序,并且可以通过索引来快速定位到满足查询条件的数据行。
下面列举了一些常用的Oracle查询表索引的语句。
1. 查看表的索引信息:```sqlSELECT index_name, table_name, column_nameFROM all_ind_columnsWHERE table_name = '表名';```这个语句可以查询指定表的所有索引,包括索引名称、索引所在的表以及索引列。
2. 查看表的主键索引:```sqlSELECT constraint_name, column_nameFROM all_cons_columnsWHERE table_name = '表名'AND constraint_name = 'PK_表名';```这个语句可以查询指定表的主键索引,包括主键约束名称以及主键列。
3. 查看表的唯一索引:```sqlSELECT index_name, table_name, column_nameFROM all_ind_columnsWHERE table_name = '表名'AND uniqueness = 'UNIQUE';```这个语句可以查询指定表的唯一索引,包括索引名称、索引所在的表以及索引列。
4. 查看表的非唯一索引:```sqlSELECT index_name, table_name, column_nameFROM all_ind_columnsWHERE table_name = '表名'AND uniqueness = 'NONUNIQUE';```这个语句可以查询指定表的非唯一索引,包括索引名称、索引所在的表以及索引列。
Oracle 索引簇索引簇是指使用索引定义簇键列数据的方法。
如果用户需要执行连接查询显示主从表的数据,则应该将主从表组织到索引簇。
1.普通表与索引簇在建立普通表时,Oracle 会为该表分配相应的表段。
例如,当建立表DEPT 和EMP 时,Oracle 会分别为这两张表分配表段DEPT 和EMP ,并且它们的数据被分别存放到这两个表段中。
如图10-7所示,表EMP 中的所有数据被存放到表段EMP 中,而表DEPT 中的数据则被存放到表段DEPT 中。
因为这两个表被存放在不同位置,所以在执行连接查询语句时,至少需要扫描两数据块才能检索到关联的数据。
empnoenamejob7954736974997521ATG SMITH ALLEN WARDCLERK CLERKSALESMAN SALESMANdeptnodnameloc10203040ACCOUNTING RESEARCH SALESOPERATIONSNEW YORK DALLAS CHICAGO BOSTONDEPT deptno10203030EMP图10-7 普通表存放数据的方式使用索引簇存储表数据时,Oracle 会将不同表的相关数据按照簇键值的存放在簇段中。
例如,当建立索引簇EMP_DEPT 时,并将EMP 和DEPT 表组织到索引簇后,Oracle 会按照簇键DEPTNO 存放相关数据,如图10-8所示。
簇键(deptno)107954778278397934ATG CLARK KING MILLER ACCOUNTINGdname NEW YORKloc20RESEARCH DALLAS73697566778878767902SMITH JONES SCOTT ADAMS FORDDEPT_EMP图10-8 索引簇存储数据表EMP 和DEPT 中的所有数据被存储在簇段DEPT_EMP 中。
因为关联数据被存储到同一个数据块,所以当执行如下的连接查询语句检索部门为10及该部门的雇员信息时,只需要扫描一个数据块就可以检索到关联数据。
Oracle下查看索引的语句
1. 查询⼀张表⾥⾯索引
select*from user_indexes where table_name=upper('bills');
2. 查询被索引字段
select*from user_ind_columns where index_name=('in_bills');
3. 给某⼀字段创建索引
create index in_bills on bills(account_id);
如果您认为这篇⽂章还不错或者有所收获,您可以通过右边的“打赏”功能打赏我⼀杯咖啡【物质⽀持】,也可以点击⽂章下⽅“推荐”按钮【精神⽀持】,您的“推荐”将是我最⼤的写作动⼒!
必须在⽂章页⾯明显位置给出作者和原⽂连接,凡是转载于本⼈的⽂章,不能设置打赏功能,如有特殊需求请与本⼈联系!
欢迎各位转载,但是未经作者本⼈同意,转载⽂章之后必须在⽂章页⾯明显位置给出作者和原⽂连接。
oracle 查询索引语句一、查询索引定义1. 查询Oracle数据库中所有的索引```SELECT index_name, table_name FROM all_indexes;```2. 查询指定表中的所有索引```SELECT index_name FROM all_indexes WHERE table_name = '表名';```3. 查询指定索引的定义```SELECT index_name, table_name, column_name FROM all_ind_columns WHERE index_name = '索引名';```4. 查询索引的类型```SELECT index_name, table_name, index_type FROM all_indexes;```5. 查询索引的存储方式```SELECT index_name, table_name, index_type, index_subpartition_name, index_partition_name FROM all_indexes;```二、查询索引状态与统计信息1. 查询索引的状态(有效/无效)```SELECT index_name, status FROM all_indexes;```2. 查询索引的使用情况(最后一次访问时间、读取次数等)```SELECT index_name, last_analyzed, num_rows, leaf_blocks, distinct_keys, clustering_factor FROM all_indexes;```3. 查询索引的大小```SELECT index_name, table_name, index_type, ROUND(bytes/1024/1024, 2) AS size_mb FROM dba_segments WHERE segment_type = 'INDEX';```4. 查询索引的碎片化情况```SELECT index_name, table_name, index_type, blevel, leaf_blocks, distinct_keys, clustering_factor FROM all_indexes; ```5. 查询索引的使用情况(是否被频繁访问)```SELECT index_name, table_name, user_reads, user_updates FROM all_indexes;```三、查询索引的相关约束1. 查询索引所属的表的主键约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'UNIQUE';```2. 查询索引所属的表的外键约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```3. 查询索引所属的表的唯一约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```4. 查询索引所属的表的检查约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```5. 查询索引所属的表的默认值约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```四、查询索引的相关操作1. 查询索引的创建语句```SELECT dbms_metadata.get_ddl('INDEX', '索引名') FROM dual; ```2. 查询索引的重建语句```SELECT 'ALTER INDEX ' || index_name || ' REBUILD;' FROM all_indexes;```3. 查询索引的重命名语句```SELECT 'ALTER INDEX ' || index_name || ' RENAME TO 新索引名;' FROM all_indexes;```4. 查询索引的删除语句```SELECT 'DROP INDEX ' || index_name || ';' FROM all_indexes;```5. 查询索引的禁用语句```SELECT 'ALTER INDEX ' || index_name || ' UNUSABLE;' FROM all_indexes;```五、查询索引的相关性能优化1. 查询索引是否需要重新构建```SELECT index_name, table_name, last_analyzed FROM all_indexes WHERE last_analyzed < SYSDATE - 30;```2. 查询未使用的索引```SELECT index_name, table_name FROM all_indexes WHERE status = 'VALID' AND (user_reads = 0 OR user_updates = 0); ```3. 查询索引碎片化严重的情况```SELECT index_name, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor FROM all_indexes WHERE blevel > 3;```4. 查询索引的大小是否过大```SELECT index_name, table_name, index_type, ROUND(bytes/1024/1024, 2) AS size_mb FROM dba_segments WHERE segment_type = 'INDEX' AND bytes/1024/1024 > 100;```5. 查询索引的选择性是否低```SELECT index_name, table_name, distinct_keys, num_rows, (distinct_keys/num_rows) AS selectivity FROM all_indexes WHERE selectivity < 0.1;```六、查询索引的相关性能统计1. 查询索引的读取次数与更新次数```SELECT index_name, table_name, user_reads, user_updates FROM all_indexes;```2. 查询索引的平均访问时间```SELECT index_name, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor, num_rows, (leaf_blocks/clustering_factor) AS avg_access_time FROM all_indexes;```3. 查询索引的存储效率```SELECT index_name, table_name, blevel, leaf_blocks,distinct_keys, clustering_factor, (leaf_blocks/clustering_factor) AS storage_efficiency FROM all_indexes;```4. 查询索引的选择性```SELECT index_name, table_name, distinct_keys, num_rows, (distinct_keys/num_rows) AS selectivity FROM all_indexes;```5. 查询索引的碎片率```SELECT index_name, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor, (leaf_blocks/clustering_factor) AS fragmentation FROM all_indexes;```以上是关于Oracle查询索引的一些常用语句,通过这些语句可以方便地查询索引的定义、状态、统计信息以及进行相关操作和性能优化。
在Oracle中查看所有的表:select * from tab/dba_tables/dba_objects/cat;看用户建立的表 :selecttable_name from user_tables; //当前用户的表selecttable_name from all_tables; //所有用户的表selecttable_name from dba_tables; //包括系统表select * from user_indexes //可以查询出所有的用户表索引查所有用户的表在all_tables主键名称、外键在all_constraints索引在all_indexes但主键也会成为索引,所以主键也会在all_indexes里面。
具体需要的字段可以DESC下这几个view,dba登陆的话可以把all换成dba1、查找表的所有索引(包括索引名,类型,构成列):select t.*,i.index_type from user_ind_columnst,user_indexesi where t.index_nam e = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表2、查找表的主键(包括名称,构成列):select cu.* from user_cons_columns cu, user_constraints au where cu.constraint _name = au.constraint_name and au.constraint_type = 'P' and au.table_name = 要查询的表3、查找表的唯一性约束(包括名称,构成列):selectcolumn_name from user_cons_columns cu, user_constraints au where cu. constraint_name = au.constraint_name and au.constraint_type = 'U' and au.table _name = 要查询的表4、查找表的外键(包括名称,引用表的表名和对应的键名,下面是分成多步查询):select * from user_constraints c where c.constraint_type = 'R' and c.table_name = 要查询的表查询外键约束的列名:select * from user_cons_columns cl where cl.constraint_name = 外键名称查询引用表的键的列名:select * from user_cons_columns cl where cl.constraint_name = 外键引用表的键名5、查询表的所有列及其属性select t.*,MENTS from user_tab_columnst,user_col_comments c where t.t able_name = c.table_name and t.column_name = c.column_name and t.table_na me = 要查询的表。
一.索引介绍1.1 索引的创建语法:CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>ON <schema>.<table_name>(<column_name> | <expression> ASC | DESC,<column_name> | <expression> ASC | DESC,...)TABLESPACE <tablespace_name>STORAGE <storage_settings>LOGGING | NOLOGGINGCOMPUTE STATISTICSNOCOMPRESS | COMPRESS<nn>NOSORT | REVERSEPARTITION | GLOBAL PARTITION<partition_setting>相关说明1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression 时即“基于函数的索引”3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)4)STORAGE:可进一步设置表空间的存储参数5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)6)COMPUTE STATISTICS:创建新索引时收集统计信息7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区1.2 索引特点:第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
Oracle 表空间索引存储与碎片检查Oracle 表空间索引存储检查,Oracle 表空间索引碎片查看,包括查看系统表中的用户索引、索引的存储情况检查、索引的选择性、确定索引的实际碎片。
1、查看系统表中的用户索引在 Oracle 中,SYSTEM 表是安装数据库时自动建立的,它包含数据库的全部数据字典Oracle 表空间索引存储检查,Oracle 表空间索引碎片查看,包括查看系统表中的用户索引、索引的存储情况检查、索引的选择性、确定索引的实际碎片。
1、查看系统表中的用户索引在 Oracle 中,SYSTEM 表是安装数据库时自动建立的,它包含数据库的全部数据字典,存储过程、包、函数和触发器的定义以及系统回滚段。
一般来说,应该尽量避免在 SYSTEM 表中存储非 SYSTEM 用户的对象。
因为这样会带来数据库维护和管理的很多问题。
一旦 SYSTEM 表损坏了,只能重新生成数据库。
我们可以用下面的语句来检查在 SYSTEM 表内有没有其他用户的索引存在。
以下为引用内容:SELECT *FROM dba_indexesWHERE tablespace_name = 'SYSTEM' AND owner NOT IN ('SYS', 'SYSTEM')2、索引的存储情况检查Oracle 为数据库中的所有数据分配逻辑结构空间。
数据库空间的单位是block 、extent 和 segment 。
Block :Oracle 使用和分配的最小存储单位。
由数据库建立时设置的DB_BLOCK_SIZE 决定的。
一旦数据库生成了,数据块的大小不能改变。
要想改变只能重新建立数据库。
Extent :由一组连续的 block 组成的。
一个或多个 extent 组成一个segment 。
当一个 segment 中的所有空间被用完时,Oracle 为它分配一个新的extent 。
Oracle 显示索引信息
为了显示Oracle索引的信息,Oracle提供了一系列的数据字典视图。
通过查询这些数据字典视图,用户可以了解索引的各方面信息。
1.显示表的所有索引
索引是用于加速数据存储的数据库对象。
通过查询数据字典视图DBA_INDEXES,可以显示数据库的所有索引;通过查询数据字典视图ALL_INDEXES,可以显示当前用户可访问的所有索引;查询数据字典视图USER_INDEXES,可以显示当前用户的索引信息。
下面以显示SCOTT用户EMP表的所有索引为例,说明使用数据字典视图DBA_INDEXES的方法:
SQL> connect system/password
已连接。
SQL> select index_name,index_type,uniqueness
2 from dba_indexes
3 where owner='SCOTT' and table_name='EMP';
INDEX_NAME INDEX_TYPE UNIQUENES
------------------------------ --------------------------- ---------
EMP_ENAME_INDEX NORMAL NONUNIQUE
EMP_JOB_BMP BITMAP NONUNIQUE
IDX_ENAME FUNCTION-BASED NORMAL NONUNIQUE
PK_EMP NORMAL/REV UNIQUE
如上所示,INDEX_NAME用于标识索引名。
INDEX_TYPE用于标识索引类型:NORMAL表示普通B树索引;REV表示反向键索引;BITMAP表示位图索引;FUNCTION 表示基于函数的索引。
UNIQUENESS用于标识索引的惟一性;OWNER用于标识对象的所有者;TABLE_NAME用于标识表名。
2.显示索引列
创建索引时,需要提供相应的表列。
通过查询数据字典视图DBA_IND_COLUMNS,可以显示所有索引的表列信息;通过查询数据字典视图ALL_IND_COLUMNS,可以显示当前用户可访问所有索引的表列信息;通过查询数据字典视图USER_IND_COLUMNS,可以显示当前用户索引的表列信息。
例如,下面的语句将显示SCOTT用户的PK_EMP索引列信息:
SQL> col column_name format a20
SQL> select column_name,column_position,column_length
2 from user_ind_columns
3 where index_name='PK_EMP';
COLUMN_NAME COLUMN_POSITION COLUMN_LENGTH
-------------------- ---------------------------- -------------
EMPNO 1 22
如上所示,COLUMN_NAME用于标识索引列的名称;COLUMN_POSITION用于标识列在索引中的位置;COLUMN_LENGTH用于标识索引列的长度。
3.显示索引段位置及尺寸
建立索引时,Oracle会为索引分配相应的索引段,索引数据会被存放在索引段中,并且段名与索引名完全相同。
通过查询数据字典视图DBA_SEGMENTS,可以显示数据库所有段的详细信息;通过查询数据字典视图USER_SEGMENTS,可以显示当前用户段的详细信息。
例如,下面的语句将显示SCOTT用户的PK_EMP段的信息:
SQL> select tablespace_name,segment_type,bytes
2 from user_segments
3 where segment_name='PK_EMP';
TABLESPACE_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
USERS INDEX 65536
其中,TABLESPACE_NAME用于标识段所在的表空间;SEGMENT_TYPE用于标识段的类型;BYTES用于标识段的尺寸;SEGMENT_NAME用于标识段的名称。
4.显示函数索引
建立函数索引时,Oracle会将函数索引的信息存放到数据字典中。
通过查询数据字典视图DBA_IND_EXPRESSIONS,可以显示数据库所有函数索引所对应的函数或表达式;通过查询数据字典USER_IND_EXPRESSIONS,可以显示当前用户函数索引所对应的函数或表达式。
例如,下面的语句显示EMP表中基于函数的索引信息:
SQL> select column_expression
2 from user_ind_expressions
3 where index_name='IDX_ENAME';
COLUMN_EXPRESSION
--------------------------------------
LOWER("ENAME")。