设为首页 加入收藏

TOP

Oracle不使用索引的几种情况列举(六)
2017-01-24 08:15:17 】 浏览:612
Tags:Oracle 使用 索引 情况 列举
--------------------------------------------------------------------------------
Plan hash value: 3897349516
?
-------------------------------------------------------------------------------------
| Id? | Operation? ? ? ? ? ? ? ? ? | Name? | Rows? | Bytes | Cost (%CPU)| Time? ? |
-------------------------------------------------------------------------------------
|? 0 | SELECT STATEMENT? ? ? ? ? ? |? ? ? |? ? 1 |? ? 12 |? ? 1? (0)| 00:00:01 |
|? 1 |? TABLE ACCESS BY INDEX ROWID| T2? ? |? ? 1 |? ? 12 |? ? 1? (0)| 00:00:01 |
|*? 2 |? INDEX UNIQUE SCAN? ? ? ? | T2_PK |? ? 1 |? ? ? |? ? 1? (0)| 00:00:01 |
-------------------------------------------------------------------------------------
?
Predicate Information (identified by operation id):
---------------------------------------------------
?
? 2 - access("X"='5')
?
14 rows selected.


不出所料,这会得到我们期望的INDEX UNIQUE SCAN,而且可以看到这里没有应用函数。一定要尽可能地避免隐式转换。
还经常出现一个关于日期的问题,如果做以下查询:
select * from t where trunc(date_col)=trunc(sysdate);
而且发现这个查询没有使用DATE_COL上的索引,为了解决这个问题,可以对trunc(date_col)建立索引,或者使用区间比较运算符来查询(也许这是更容易的做法)。下面来看对日期使用大于或小于运算符的一个例子。可以认识到以下条件:
trunc(date_col)=trunc(sysdate)
与下面的条件是一样的:
date_col>= trunc(sysdate) and date_col如果可能的话,倘若谓词中有函数,尽量不要对数据库列应用这些函数。这样做不仅可以使用更多的索引,还能减少处理数据库所需的工作。使用转换的条件查询时只会计算一次TRUNC值,然后就能使用索引来查找满足条件的值。使用trunc(date_col)=trunc(sysdate)时,trunc(date_col)则必须对整个表(而不是索引)中的每一行计算一次。
情况5:
另一种情况,如果使用了索引,实际上反而会更慢。Oracle(对于CBO而言)只会在合理地时候才使用索引。
zx@ORCL>create table t3 (x,y null,primary key (x) ) as select rownum x,object_name y from all_objects;
?
Table created.
?
zx@ORCL>exec dbms_stats.gather_table_stats(USER,'T3',cascade=>true);
?
PL/SQL procedure successfully completed.
?
zx@ORCL>set autotrace traceonly explain?
--运行一个查询查询相对较少的数据
zx@ORCL>select count(y) from t3 where x<50;
?
Execution Plan
----------------------------------------------------------
Plan hash value: 1961899233
?
----------------------------------------------------------------------------------
| Id? | Operation? ? ? ? | Name? ? ? ? | Rows? | Bytes | Cost (%CPU)| Time? ? |
----------------------------------------------------------------------------------
|? 0 | SELECT STATEMENT? |? ? ? ? ? ? ? |? ? 1 |? ? 5 |? ? 2? (0)| 00:00:01 |
|? 1 |? SORT AGGREGATE? |? ? ? ? ? ? ? |? ? 1 |? ? 5 |? ? ? ? ? ? |? ? ? ? ? |
|*? 2 |? INDEX RANGE SCAN| SYS_C0017451 |? ? 49 |? 245 |? ? 2? (0)| 00:00:01 |
----------------------------------------------------------------------------------
?
Predicate Information (identified by operation id):
---------------------------------------------------
?
? 2 - access("X"<50)
--运行一个查询查询相对较多的数据
zx@ORCL>select count(y) from t3 where x<50000;
?
Execution Plan
----------------------------------------------------------
Plan hash value: 463314188
?
---------------------------------------------------------------------------
| Id? | Operation? ? ? ? ? | Name | Rows? | Bytes | Cost (%CPU)| Time? ? |
---------------------------------------------------------------------------
|? 0 | SELECT STATEMENT? |? ? ? |? ? 1 |? ? 30 |? 117? (1)| 00:00:02 |
|? 1 |? SORT AGGREGATE? ? |? ? ? |? ? 1 |? ? 30 |? ? ? ? ? ? |? ? ? ? ? |
|*? 2 |? TABLE ACCESS FULL| T3? | 50000 |? 1464K|? 117? (1)| 00:00:02 |
---------------------------------------------------------------------------
?
Predicate Information (identified by operation id):
---------------------------------------------------
?
? 2 - filter("X"<50000)


这个例子显示出优化器不一定会使用索引,而且实际上,它会做出正确的选择。对查询调优时,如果发现你认为本

首页 上一页 3 4 5 6 下一页 尾页 6/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇RMAN无法删除归档日志 下一篇Oracle order by子句对NULL的排序

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目