ORACLE 组合索引 使用分析

在ORACLE 中可以创建组合索引,使用表中多个字段的组合作为索引的键值。

当我们进行查询时可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,但是”where col2 = ? ”查询就不会使用该索引。所以限制条件中包含先导列时,该限制条件才会使用该组合索引。

就此我做了下试验:

SQL> create table zh
  2  (it int,
  3   name varchar(30),
  4   id number(30));

表已创建。

SQL> R
  1  INSERT INTO ZH
  2* SELECT * FROM ZH

已创建147456行。

(创建了147456行)

SQL> COMMIT;

提交完成。

SQL> CREATE INDEX ZHIN
  2  ON ZH(IT,NAME);

索引已创建。

SQL> COMMIT;

提交完成。

SQL> INSERT INTO ZH
  2  VALUES(3,'GAOJING',444);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT * FROM ZH
  2  WHERE IT=3;

        IT NAME                                   ID
---------- ------------------------------ ----------
         3 GAOJING                               444

SQL> SET AUTOTRACE ON;
SQL> R
  1  SELECT * FROM ZH
  2* WHERE IT=3

        IT NAME                                   ID
---------- ------------------------------ ----------
         3 GAOJING                               444

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=ALL_ROWS (Cost=4 Card=1 Bytes=43)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'ZH' (TABLE) (Cost=4 Card
   2    1     INDEX (RANGE SCAN) OF 'ZHIN' (INDEX) (Cost=3 Card=1)

 

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
          0  bytes sent via SQL*Net to client
          0  bytes received via SQL*Net from client
          0  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> L
  1  SELECT * FROM ZH
  2* WHERE IT=3
SQL> L2
  2* WHERE IT=3
SQL> C/IT=3/NAME='GAOJING'
  2* WHERE NAME='GAOJING'
SQL> R
  1  SELECT * FROM ZH
  2* WHERE NAME='GAOJING'

        IT NAME                                   ID
---------- ------------------------------ ----------
         3 GAOJING                               444

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=ALL_ROWS (Cost=201 Card=10 Bytes=
   1    0   TABLE ACCESS (FULL) OF 'ZH' (TABLE) (Cost=201 Card=10 Byte

SQL> select * from zh
  2  where it=3 and name='GAOJING';

        IT NAME                                   ID
---------- ------------------------------ ----------
         3 GAOJING                               444

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=ALL_ROWS (Cost=4 Card=1 Bytes=43)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'ZH' (TABLE) (Cost=4 Card
   2    1     INDEX (RANGE SCAN) OF 'ZHIN' (INDEX) (Cost=3 Card=1)

 

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
          0  bytes sent via SQL*Net to client
          0  bytes received via SQL*Net from client
          0  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
          0  bytes sent via SQL*Net to client
          0  bytes received via SQL*Net from client
          0  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

试验证明结果确实如此

时间: 2024-10-05 18:23:44

ORACLE 组合索引 使用分析的相关文章

关于ORACLE组合索引内部存储浅谈

本文任何观点为作者观点,水平有限难免有误    关于组合索引不需要多谈就是多个列一起建立的索引,关于组合索引很常见的一个问题就是当谓词中出现了前导列才能够使用索引,如果 没有出现前导列是不能使用索引,当然index skip scan和index full scan除外.    理论如此,但是为什么谓词中没有前导列就不能使用索引,接下来通过DUMP来看看组合索引如何存放数据 建立测试表,为了方便论述和区别这里使用全数字同时组合索引的两个列完全是反序的: create table testt1 (

Oracle 索引质量分析

      索引质量的高低对数据库整体性能有着直接的影响.良好高质量的索引使得数据库性能得以数量级别的提升,而低效冗余的索引则使得数据库性能缓慢如牛,即便是使用高档的硬件配置.因此对于索引在设计之初需要经过反复的测试与考量.那对于已经置于生产环境中的数据库,我们也可以通过查询相关数据字典得到索引的质量的高低,通过这个分析来指导如何改善索引的性能.下面给出了演示以及索引创建的基本指导原则,最后给出了索引质量分析脚本.   1.查看索引质量 --获取指定schema或表上的索引质量信息报告 gx_a

【oracle 性能优化】组合索引查询。

在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引.组合索引的使用存在着一定的局限,只有在谓词中出现全部索引列时才能使用效率最高的index unique scan, 否则谓词中必须包含前导列,否则会走Index full scan或者FTS. SQL> create index idx_test on yangtest (object_type,object_name); 索引已创建. SQL> exec dbms_stats.gather_table_stats(user,

Oracle数据库索引的维护_oracle

正在看的ORACLE教程是:Oracle数据库索引的维护. 本文只讨论Oracle中最常见的索引,即是B-tree索引.本文中涉及的数据库版本是Oracle8i. 一. 查看系统表中的用户索引 在Oracle中,SYSTEM表是安装数据库时自动建立的,它包含数据库的全部数据字典,存储过程.包.函数和触发器的定义以及系统回滚段. 一般来说,应该尽量避免在SYSTEM表中存储非SYSTEM用户的对象.因为这样会带来数据库维护和管理的很多问题.一旦SYSTEM表损坏了,只能重新生成数据库.我们可以用下

关于ORACLE位图索引内部浅论

我们都知道ORACLE位图索引适用于字段不同值很少的情况,同时修改DML会导致整个同样的值 全部被锁定,这严重影响了并发性,所以不建议OLTP系统大量使用位图索引. 但是具体位图索引的内部是如何排列和组织的呢?如下将进行探讨,由于水平有限可能有一定错误. 首先认识BITMAP索引的组织方式,首先看一下ORACLE给出的这张图 可以看到本图中实际上有4种颜色蓝色.绿色.红色.黄色,BITMAP 索引也是B-TREE的格式,但是其页节点存储 的是键值+ROWID范围+位图键的方式,这样一来可以很明显

ORACLE常见错误代码的分析与解决(二)

oracle|错误|解决 ORACLE常见错误代码的分析与解决(二)   文章源自于  世纪易网   ORA-01578:Oracle data block corrupted(file # num,block # num)   产生原因:当ORACLE访问一个数据块时,由于1.硬件的I/O错误:2.操作系统的I/O错误或缓冲问题:3.内存或paging问 题:4.ORACLE试图访问一个未被格式化的系统块失败:5.数据文件部分溢出等上述几种情况的一种引起了逻辑坏块或者 物理坏块,这时就会报OR

Oracle中如何使用表分析

1.三大功能 (1)搜集和删除索引.表和簇的统计信息 (2)验证表.索引和簇的结构 (3)鉴定表和簇和行迁移和行联接 针对analyze的搜集和删除统计信息功能而言,oracle推荐使用DBMS_STATS包来搜集优化信息,DBMS_STATS可以并行的搜集信息,可以搜集分区表的全局信息,进一步来说,按成本的优化器只会使用DBMS_STATS包所统计出来的信息. 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/O

Oracle监控索引怎么使用

Oracle监控索引使用   Oracle提供一个监控索引的方法,来确定索引是否被使用.如果索引没有被使用,就可以删除它们以减少不必要的语句的开销.因为表上的大量不必要的索引可能会降低DML语句的性能,给数据库性能产生压力.所以生产环境上,以根据业务增长情况定期监控.分析数据库索引的使用,特别是一些大表上的索引,提升数据库事务提交的性能.   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 --查看表上的索引 SQL> Selectindex

数据-oracle 分区索引效率问题

问题描述 oracle 分区索引效率问题 有A,B两张表,都加了range的分区索引,表空间什么都是一样的,在同一个分区下面 A的数据量和B的数据量是一样多的,但是查询的时候A的查询效率要慢很多,请问大家能帮我分析一下还有什么原因会导致这个结果吗?谢谢 解决方案 信息量实在太少,据你所说,AB两表都一样,那完全没道理查询效率不同.建议提供更详细的资料,如AB表的建表语句. 还有就是从sql角度出发,对sql进行explain