查看: 367|回复: 3

[讨论] 本地分区索引按分区键过滤为什么还要回表

[复制链接]
论坛徽章:
0
发表于 2018-7-11 13:04 | 显示全部楼层 |阅读模式
大家好,近期遇到一个不解的问题,一个分区表,创建了一个位图分区索引,where 条件限定分区键是整个分区,同时对位图索引字段做过滤,想的是应该直接操作这个位图分区索引就行了,但执行计划中依然回表了。实验如下:

--建分区表
create table t_part
     partition by range(object_id) interval (5000)
     (
        partition t_part_p0 values less than  (5000)
     )
     as select *  from dba_objects t where object_id is not null;


--建owner字段的位图索引,local
create bitmap index idx_t_part_id_local on t_part(owner) local;

--查询1个分区
select count(1) from t_part    where owner='SYS' and object_id>=5000 and object_id<15000;

--执行计划
SQL> select count(owner) from t_part    where owner='SYS' and object_id>=5000 and object_id<10000;

已用时间:  00: 00: 00.01

执行计划
----------------------------------------------------------
Plan hash value: 1923963672

---------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                                | Name                | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                                 |                     |     1 |    30 |    18   (0)| 00:00:01 |       |       |
|   1 |  SORT AGGREGATE                                   |                     |     1 |    30 |            |       |          |       |
|   2 |   PARTITION RANGE SINGLE                      |                     |  1817 | 54510 |    18   (0)| 00:00:01 |     2 |     2 |
|*  3 |    TABLE ACCESS BY LOCAL INDEX ROWID | T_PART              |  1817 | 54510 |    18   (0)| 00:00:01 |     2 |     2 |
|    4 |     BITMAP CONVERSION TO ROWIDS       |                     |       |       |            |       |          |       |
|*  5 |      BITMAP INDEX SINGLE VALUE             | IDX_T_PART_ID_LOCAL |       |       |            |       |        2 |     2 |
---------------------------------------------------------------------------------------------------------------------------

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

   3 - filter("OBJECT_ID">=5000 AND "OBJECT_ID"<10000)
   5 - access("OWNER"='SYS')

Note
-----
   - dynamic sampling used for this statement (level=2)


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


id=3 的地方,有 TABLE ACCESS BY LOCAL INDEX ROWID  这个回表操作。我觉得不是应该没这个操作吗?


我直接指定分区名查询,并没有回表的操作
SQL> select count(owner) from t_part partition (SYS_P5631)   where owner='SYS' ;

已用时间:  00: 00: 00.00

执行计划
----------------------------------------------------------
Plan hash value: 1646968710

---------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                      | Name                      | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                                 |     1 |    17 |    12   (0)| 00:00:01 |       |       |
|   1 |  SORT AGGREGATE                         |                                  |     1 |    17 |            |          |       |       |
|   2 |   PARTITION RANGE SINGLE            |                                 |  2859 | 48603 |    12   (0)| 00:00:01 |     2 |     2 |
|   3 |    BITMAP CONVERSION TO ROWIDS|                                 |  2859 | 48603 |    12   (0)| 00:00:01 |       |       |
|*  4 |     BITMAP INDEX SINGLE VALUE | IDX_T_PART_ID_LOCAL |       |       |            |          |     2 |     2 |
---------------------------------------------------------------------------------------------------------------------

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

   4 - access("OWNER"='SYS')

Note
-----
   - dynamic sampling used for this statement (level=2)


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



不解的是:既然where条件中已经指定分区键为单个分区,为啥还回表?指定分区名就没这个问题。local的索引都要回表?那感觉没那么智能了。
认证徽章
论坛徽章:
23
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29蒙奇·D·路飞
日期:2018-08-10 09:29:14弗兰奇
日期:2018-07-19 17:11:57娜美
日期:2018-06-22 09:24:50秀才
日期:2018-06-21 10:08:00ITPUB15周年纪念
日期:2018-03-20 15:45:33ITPUB15周年纪念
日期:2018-03-20 15:25:18托尼托尼·乔巴
日期:2018-02-05 08:12:49蒙奇·D·路飞
日期:2018-01-31 16:03:23秀才
日期:2018-01-02 15:35:05
发表于 2018-7-11 13:39 | 显示全部楼层
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter("OBJECT_ID">=5000 AND "OBJECT_ID"<10000)

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2018-7-11 13:47 | 显示全部楼层
guocun09 发表于 2018-7-11 13:39
Predicate Information (identified by operation id):
----------------------------------------------- ...

我是觉得 这个fiter 不该有啊   Oracle 根据where条件知道查哪个分区了,而且是整个分区,为啥还要回表做这个filter

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2018-7-11 15:46 | 显示全部楼层
索引里不包含 OBJECT_ID 的信息,不回表怎么判断?   要不你禁止走索引试试,

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表