免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 16467 | 回复: 7
打印 上一主题 下一主题

11G的sql优化问题TABLE ACCESS FULL不走索引 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-05 23:04 |只看该作者 |倒序浏览
select to_char(tracedata0_.RECEIVE_DATE, 'yyyy-MM-dd') as col_0_0_, tracedata0_.CONTENT_TYPE as col_1_0_, count(*) as col_2_0_ from TRACE_DATA tracedata0_ where 1=1 and tracedata0_.RECEIVE_DATE>=:1 and tracedata0_.RECEIVE_DATE<:2 group by tracedata0_.CONTENT_TYPE , to_char(tracedata0_.RECEIVE_DATE, 'yyyy-MM-dd') 由于先前在另个查询语句用到CONDITION_ID,PROJECT_ID,RECEIVE_DATE,我已经做的复合索引RECEIVE_DATE IDX_COND_PROJ_RECEDATE(CONDITION_ID,PROJECT_ID,RECEIVE_DATE),但是这个select还是为何还是走TABLE ACCESS FULL而不走索引,询问下高手

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2010-12-06 08:51 |只看该作者
由于你使用了函数。

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
3 [报告]
发表于 2010-12-06 13:06 |只看该作者


  1. select to_char(tracedata0_.RECEIVE_DATE, 'yyyy-MM-dd') as col_0_0_, tracedata0_.CONTENT_TYPE as col_1_0_, count(*) as col_2_0_
  2. from TRACE_DATA tracedata0_
  3. where 1=1
  4. and tracedata0_.RECEIVE_DATE>=:1
  5. and tracedata0_.RECEIVE_DATE<:2
  6. group by tracedata0_.CONTENT_TYPE , to_char(tracedata0_.RECEIVE_DATE, 'yyyy-MM-dd')

  7. 由于先前在另个查询语句用到CONDITION_ID,PROJECT_ID,RECEIVE_DATE,我已经做的复合索引RECEIVE_DATE IDX_COND_PROJ_RECEDATE(CONDITION_ID,PROJECT_ID,RECEIVE_DATE),
复制代码
几个问题需要注意:
1、sql格式混乱 ,不好处理
2、复合索引 中receive_date非前导列 所以不一定能用到
3、也许成优化器在计算成本时确实是全表扫描成本小于走索引

论坛徽章:
0
4 [报告]
发表于 2010-12-06 16:09 |只看该作者
SQL> select to_char(tracedata0_.RECEIVE_DATE, 'yyyy-MM-dd') as col_0_0_, tracedata0_.CONTENT_TYPE as col_1_0_, count(*) as col_2_0_
from TRACE_DATA tracedata0_
where 1=1 and tracedata0_.RECEIVE_DATE>=to_date('2010-12-05','yyyy-MM-dd') and tracedata0_.RECEIVE_DATE<to_date('2010-12-06','yyyy-MM-dd') group by tracedata0_.CONTENT_TYPE , to_char(tracedata0_.RECEIVE_DATE, 'yyyy-MM-dd');  2    3  

COL_0_0_
----------
COL_1_0_
--------------------------------------------------------------------------------
  COL_2_0_
----------
2010-12-05
mattersort_bbs
     10004

2010-12-05
mattersort_news
     68166

COL_0_0_
----------
COL_1_0_
--------------------------------------------------------------------------------
  COL_2_0_
----------

2010-12-05
mattersort_blog
     78996



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

--------------------------------------------------------------------------------
--------------------------

| Id  | Operation                     | Name                         | Rows  | Bytes
| Cost (%CPU)| Time         |

--------------------------------------------------------------------------------
--------------------------

|   0 | SELECT STATEMENT             |                                 |     3 |    72
|    68   (2)| 00:00:01 |

|   1 |  HASH GROUP BY                     |                                 |     3 |    72
|    68   (2)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID| TRACE_DATA                 |    10 |   240
|    67   (0)| 00:00:01 |

|*  3 |    INDEX SKIP SCAN             | IDX_CONID_PROID_RECE_DATE |     1 |
|    66   (0)| 00:00:01 |

--------------------------------------------------------------------------------
--------------------------


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

   3 - access("TRACEDATA0_"."RECEIVE_DATE">=TO_DATE(' 2010-12-05 00:00:00', 'syy
yy-mm-dd

              hh24:mi:ss') AND "TRACEDATA0_"."RECEIVE_DATE"<TO_DATE(' 2010-12-06
00:00:00', 'syyyy-mm-dd

              hh24:mi:ss'))
       filter("TRACEDATA0_"."RECEIVE_DATE">=TO_DATE(' 2010-12-05 00:00:00', 'syy
yy-mm-dd

              hh24:mi:ss') AND "TRACEDATA0_"."RECEIVE_DATE"<TO_DATE(' 2010-12-06
00:00:00', 'syyyy-mm-dd

              hh24:mi:ss'))


统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      30182  consistent gets
          0  physical reads
          0  redo size
        804  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          3  rows processed
跟踪了改语句,发现使用了索引,但感觉性能不佳 30182  consistent gets,oem建议单独添加个RECEIVE_DATE索引,怎么优化比较好?

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
5 [报告]
发表于 2010-12-06 16:49 |只看该作者
虽然是走了跳跃索引,但是发生的一致性gets有点多,建议增加个以receive_Date单独列的索引,然后再来观察执行计划?

论坛徽章:
0
6 [报告]
发表于 2010-12-06 17:36 |只看该作者
后来把复合索引删除,建立了独立3个索引,因为有的语句用project_id,有的用rece_data还是单独分开测试下

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
7 [报告]
发表于 2010-12-06 17:37 |只看该作者
恩  根据你的业务来决定啊!

论坛徽章:
0
8 [报告]
发表于 2010-12-10 10:16 |只看该作者
谢谢,duolanshizhe 回答
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP