ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 比较有意思的问题 --视图不走索引

比较有意思的问题 --视图不走索引

原创 Linux操作系统 作者:棉花糖ONE 时间:2009-11-18 08:46:23 0 删除 编辑
SYSTEM@oracle10g>create table test_view as select * from dba_objects;
表已创建。
SYSTEM@oracle10g>ed
已写入 file afiedt.buf
  1  create view v_test_view as select substr(object_name,0,3) object_name,
  2* object_id,object_type from test_view
SYSTEM@oracle10g>/
视图已创建。
SYSTEM@oracle10g>create index i_test_view  on test_view(object_name);
索引已创建。
SYSTEM@oracle10g>set autot trace statistics
SYSTEM@oracle10g>select * from v_test_view where object_name='AAA';
未选定行

统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        693  consistent gets
        135  physical reads
          0  redo size
        401  bytes sent via SQL*Net to client
        389  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

通过视图走全表,逻辑读也比较大

SYSTEM@oracle10g>select substr(object_name,0,3) object_name,object_id,object_type from test_view
  2   where object_name='AAA';
未选定行

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

不走视图走索引,逻辑读很小

到这里不知道大家看出问题没有,前面我特意不给出谓词信息

SYSTEM@oracle10g>select substr(object_name,0,3) object_name,object_id,object_type from test_view
  2  where object_name='AAA';
执行计划
----------------------------------------------------------
Plan hash value: 2475448246
--------------------------------------------------------------------------------
-----------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)|
Time     |
--------------------------------------------------------------------------------
-----------
|   0 | SELECT STATEMENT            |             |     1 |    90 |     1   (0)|
00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST_VIEW   |     1 |    90 |     1   (0)|
00:00:01 |
|*  2 |   INDEX RANGE SCAN          | I_TEST_VIEW |     1 |       |     1   (0)|
00:00:01 |
--------------------------------------------------------------------------------
-----------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("OBJECT_NAME"='AAA')
Note
-----
   - dynamic sampling used for this statement

SYSTEM@oracle10g>select * from v_test_view where object_name='AAA';
执行计划
----------------------------------------------------------
Plan hash value: 3554956191
-------------------------------------------------------------------------------
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |           |     8 |   720 |   156   (3)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| TEST_VIEW |     8 |   720 |   156   (3)| 00:00:02 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(SUBSTR("OBJECT_NAME",0,3)='AAA')
Note
-----
   - dynamic sampling used for this statement

这地方冒出个substr(object_name,0,3),看看前面的视图定义可以看出,视图里取的就是
substr(object_name,0,3)但是别名为object_name,因此使用视图参数的时候,oracle使用
了视图里的substr(object_name,0,3)作为查询,而索引是建立在object_name上的,因此
用不了索引,更严重的后果是,这样导致语句的含义和原本想要的结果不一致了,因此建议
在写视图的时候,如果这个字段上包含函数或者是别的计算表达式,不要用表的字段名做为
别名,修改下视图的定义

SYSTEM@oracle10g>create or replace view v_test_view as select substr(object_name,0,3) object_name1,
  2  object_name, object_id,object_type from test_view;
视图已创建。
SYSTEM@oracle10g>select * from v_test_view where object_name='AAA';
执行计划
----------------------------------------------------------
Plan hash value: 2475448246
--------------------------------------------------------------------------------
-----------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)|
Time     |
--------------------------------------------------------------------------------
-----------
|   0 | SELECT STATEMENT            |             |     1 |    90 |     1   (0)|
00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST_VIEW   |     1 |    90 |     1   (0)|
00:00:01 |
|*  2 |   INDEX RANGE SCAN          | I_TEST_VIEW |     1 |       |     1   (0)|
00:00:01 |
--------------------------------------------------------------------------------
-----------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("OBJECT_NAME"='AAA')
Note
-----
   - dynamic sampling used for this statement


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

请登录后发表评论 登录
全部评论

注册时间:2009-11-17

  • 博文量
    19
  • 访问量
    72274