索引中字段顺序对访问性能影响(一)

索引中字段的顺序确实会对访问性能有所影响,不过并不像很多人想象的那么简单。

这一篇讨论查询条件为等值的情况。

 

 

很多人认为将选择性高的字段放在索引前缀字段可以提高查询性能,事实上对于等值查询而言,哪个字段在前的性能没有差别。

SQL> create table t as
  2  select * from dba_objects;

Table created.

SQL> create index ind_t_id_owner
  2  on t(object_id, owner);

Index created.

SQL> select count(distinct object_id), count(distinct owner), count(*)
  2  from t;

COUNT(DISTINCTOBJECT_ID) COUNT(DISTINCTOWNER)   COUNT(*)
------------------------ -------------------- ----------
                   76381                   62      76424

SQL> select object_id, owner
  2  from t
  3  where object_id = 1000;

 OBJECT_ID OWNER
---------- ------------------------------
      1000 SYS

SQL> set autot on
SQL> select object_name
  2  from t
  3  where wner = 'SYS'
  4  and object_id = 1000;

OBJECT_NAME
------------------------------
V_$BUFFER_POOL_STATISTICS


Execution Plan
----------------------------------------------------------
Plan hash value: 1951931306

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     1 |    96 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T              |     1 |    96 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IND_T_ID_OWNER |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_ID"=1000 AND "OWNER"='SYS')

Note
-----
   - dynamic sampling used for this statement


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

显然object_id列的选择度很高,而owner列重复值就多得多了。通过前缀object_id列,查询语句只需要4block就可以获得记录。

但是这并不意味着前缀选择性高的列的性能就一定最高:

SQL> create index ind_t_owner_id
  2  on t(owner, object_id);

Index created.

SQL> select object_name 
  2  from t
  3  where wner = 'SYS'
  4  and object_id = 1000;

OBJECT_NAME
------------------------------
V_$BUFFER_POOL_STATISTICS


Execution Plan
----------------------------------------------------------
Plan hash value: 2014292028

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     1 |    96 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T              |     1 |    96 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IND_T_OWNER_ID |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OWNER"='SYS' AND "OBJECT_ID"=1000)

Note
-----
   - dynamic sampling used for this statement


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

对于同时包含索引所有列,且条件都是相等的查询,访问性能与前缀列的选择性没有关系。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-679182/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-679182/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多个字段的联合索引可以对查询性能产生积极的影响。通过将多个字段组合成一个联合索引,可以提高查询的效率,并减少查询所需的时间和资源消耗。 以下是一些多字段联合索引影响: 1. 提高查询效率:当你执行包含联合索引涉及的字段的查询时,数据库可以更快地定位到满足索引条件的数据。这样可以减少全表扫描的需要,从而提高查询的速度。 2. 减少索引文件大小:相比于单独创建多个单列索引,使用联合索引可以减少索引文件的大小。这对于存储和维护索引数据来说是有益的,特别是当表具有大量数据行时。 3. 约束数据完整性:联合索引可以用于实施数据完整性约束。通过在多个字段上创建联合唯一索引,可以确保这些字段的组合值在表是唯一的,防止重复或冲突的数据被插入。 需要注意的是,使用联合索引也可能存在一些潜在的影响: 1. 更新和插入操作的性能:当你执行包含联合索引字段的更新和插入操作时,数据库需要维护索引的值。这可能会对更新和插入操作的性能产生一些额外的开销。 2. 查询字段顺序:联合索引字段顺序很重要。如果你的查询条件字段顺序与联合索引字段顺序不匹配,那么索引将无法有效地支持查询,从而导致性能下降。 3. 索引选择性:联合索引的选择性是指索引不同值的数量与表总行数的比例。如果联合索引的选择性很低,即索引的不同组合值较少,那么它可能不会带来明显的性能提升。 因此,在创建多字段联合索引时,你需要综合考虑查询模式、数据完整性、索引选择性以及更新和插入操作的性能等因素。根据具体的业务需求和数据访问模式,进行适当的索引设计和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值